不论是硬件临界资源,还是软件临界资源,多个线程必须互斥地对它进行访问。每个线程中访问临界资源的那段代码称为临界区(Critical Section)。每个线程中访问临界资源的那段程序称为临界区(Critical Section)(临界资源是一次仅允许一个线程使用的共享资源)。每次只准许一个线程进入临界区,进入后不允许其他线程进入。 不论是硬件临界资源,还是软件临界资源,多个线程必须互斥地对它进行访问。
1、CRITICAL_SECTION同步:
VOID InitializeCriticalSection(
LPCRITICAL_SECTION lpCriticalSection // critical section 一个指针,指向欲初始化的CRITICAL_SECTION变量
);
当用完critical section时,必须调用DeleteCriticalSection()清除它。这个函数并没有“释放对象”的意义在里面,不
同于C++中的delete运算符。
VOID DeleteCriticalSection(
LPCRITICAL_SECTION lpCriticalSection // critical section指向不需要的CRITICAL_SECTION变量
);
例子:CRITICAL_SECTION gCriticalSection;
void CreateDeleteCriticalSection()
{
InitializeCriticalSection(&gCriticalSection);
/*Do Something here */
DeleteCriticalSection(&gCriticalSection);
}
2、内核同步:
A、互斥量 同步
HANDLECreateMutex(
LPSECURITY_ATTRIBUTESlpMutexAttributes,
BOOLbInitialOwner,
LPCTSTRlpName
);
函数说明:
第一个参数表示安全控制,一般直接传入NULL。
第二个参数用来确定互斥量的初始拥有者。如果传入TRUE表示互斥量对象内部会记录创建它的线程的线程ID号并将递归计数设置为1,由于该线程ID非零,所以互斥量处于未触发状态。如果传
入FALSE,那么互斥量对象内部的线程ID号将设置为NULL,递归计数设置为0,这意味互斥量不为任何线程占用,处于触发状态。
第三个参数用来设置互斥量的名称,在多个进程中的线程就是通过名称来确保它们访问的是同一个互斥量。
函数访问值:
成功返回一个表示互斥量的句柄,失败返回NULL。
WaitForSingleObject(ThreadMutex,INFINITE);
//临界区的开始
//临界区的结束
ReleaseMutex(ThreadMutex);
因此使用CloseHandle()就可以
http://www.cnblogs.com/kennyMc/archive/2012/12/15/2818887.html
B、信号两年同步:
HANDLE CreateSemaphore(
LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
LONG lInitialCount,
LONG lMaximumCount,
LPCTSTR lpName
);
函数说明:
第一个参数表示安全控制,一般直接传入NULL。
第二个参数表示初始资源数量。
第三个参数表示最大并发数量。
第四个参数表示信号量的名称,传入NULL表示匿名信号量。
BOOL ReleaseSemaphore(
HANDLE hSemaphore,
LONG lReleaseCount,
LPLONG lpPreviousCount
);
函数说明:
第一个参数是信号量的句柄。
第二个参数表示增加个数,必须大于0且不超过最大资源数量。
第三个参数可以用来传出先前的资源计数,设为NULL表示不需要传出。
http://www.cnblogs.com/huhuuu/p/3588077.html
C、事件对象同步,
// 创建或打开一个命名的或匿名的事件对象
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, // [in]
BOOL bManualReset, // [in]
BOOL bInitialState, // [in]
LPCTSTR lpName // [in]
);
例:
HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
// 把指定的事件对象设置为有信号状态
BOOL SetEvent(
HANDLE hEvent // [in]
);
// 把指定的事件对象设置为无信号状态
BOOL ResetEvent(
HANDLE hEvent // [in]
);
// 请求事件对象
DWORD WaitForSingleObject(
HANDLE hHandle, // [in]
DWORD dwMilliseconds // [in]
);
http://www.cnblogs.com/fangyukuan/archive/2010/09/04/1817750.html