1. Critical Section(关键区域、临界区域)
指一小块“用来处理一份被共享之资源”的程序代码。一次只能有一个线程获准访问资源。千万不要在一个critical section中调用Sleep()或任何Wait…()API函数。
主要函数:InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
DeleteCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);
EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
Leave CriticalSection(LPCRITICAL_SECTIONlpCriticalSection);
2. Mutexes(互斥器)
一个时间内只能有一个线程拥有mutex,和critical section做着同样的事情。
不同点:(1)锁住一个未被拥有的mutex,比锁住一个未被拥有的critical section,需要花费几乎100倍的时间,因为critical section不要进入操作系统核心,直就可以进行操作。
(2)mutex可以跨进程使用,critical section则只能够在同一个进程中使用。
(3)等待一个mutex时,你可以指定“结束等待”的时间长度,但对于critical section则不行。
主要函数: HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes,BOOLbInitialOwner,LPCTSTR lpName);
HANDLE OpenMutex(DWORD dwDesiredAccess,BOOL bInheritHandle, LPCTSTRlpName);
BOOL ReleaseMutex(HANDLEhMutex);
3. Semaphores(信号量)
解决各种producer/consumer问题的关键要素,这种问题会存有一个缓冲区,可能在同一时间内被读出数据或被写入数据。
HANDLECreateSemaphore(LPSECURITY_ATTRIBUTES lpMutexAttributes,LONG lInitialCount, LONGlMaximumCount,LPCTSTR lpName);
BOOL ReleaseSemaphore(HANDLEhSemaphore,LONG lReleasseCount,LPLONG lpPreviousCount);
4. Event Objects(事件)
事件的激发状态和未激发状态完全由程序控制。
HANDLE CreateEvent(LPSECURITY_ATTRIBUTESlpMutexAttributes,bool bManualReset,BOOL bInitialState ,LPCTSTR lpName);
BOOL SetEvent(HANDLE hEvent); //把event对象设为激发状态
BOOL ResetEvent(HANDLE hEvent);//把event对象设为非激发状态
BOOLPulseEvent(HANDLE hEvent);//如果是一个Manual ResetEvent,把Event对象设为激发状态,唤醒“所有”等待中的线程,然后event恢复为非激发状态。如果是一个AutoReset Event,把Event对象设为激发状态,唤醒一个等待中的线程,然后event对象恢复为非激发状态。
5. Interlocked Variables
对着标准的32位变量进行操作。
LONG InterlockedIncrement(LPLONGlpTarget);
LONG InterlockedDecrement(LPLONGlpTarget);
LONG InterlockedExchange(LPLONGlpTarget,LONG lValue);