1.临界区(Critical Section):适合一个进程内的多线程访问公共区域或代码段时使用,防止多个线程同时访问一个变量或者代码段。
2.互斥量(Mutex):适合不同进程内多线程访问公共区域或者代码段时使用,可以一进程内多线程使用,也可以多个进程多线程使用。
3.事件(EVENT):通过线程间触发事件实现同步互斥,适用于后一线程需要等待前一个线程数据输出使用
4.信号量(Semaphore):与临界区和互斥量不同,可以实现多个线程同时访问公共区域数据,原理与操作系统中的PV操作类似,先设置一个访问公共区域的线程最大连接数,每一个线程访问共享区资源数就减一,直到资源数小于等于零。
下面为同步互斥使用流程
互斥:
关键段CS :
创建或初始化 InitializeCriticalSection(PCRITICAL_SECTION lpCriticalSection)
销毁 DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection)
进入关键区域 EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection)
离开关键区域 LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection)
互斥量Mutex:
创建或初始化 CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes,
BOOL bInitialOwner,
LPCTSTR lpName)
销毁 CloseHandle (HANDLE hMutex)
进入互斥区域 WaitForSingleObject(HANDLE hMutex, INFINITE)
离开互斥区域 ReleaseMutex(HANDLE hMutex)
同步:
事件Event
创建 CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes,
BOOL bManualReset,
BOOL bInitialState,
LPCTSTR lpName)
销毁 CloseHandle(HANDLE hEvent)
使事件触发 SetEvent(HANDLE hEvent)
使事件未触发 ResetEvent(HANDLE hEvent)
信号量Semaphore
创建 CreateSemaphore( LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
LONG lInitialCount,
LONG lMaximumCount,
LPCTSTR lpName)
销毁 CloseHandle(ANDLE hSemaphore)
递减计数 WaitForSingleObject(HANDLE hSemaphore, INFINITE)
递增计数 ReleaseSemaphore(HANDLE hSemaphore,
LONG lReleaseCount,
LPLONG lpPreviousCount )