线程同步控制

来源:互联网 发布:看dota2数据的app 编辑:程序博客网 时间:2024/06/08 11:24

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);

 

原创粉丝点击