1.临界区(Critical Section):适合一个进程内的多线程访问公共区域或代码段时使用。
API:
VOID EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection); //进入临界区
VOID LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection); //离开临界区
某一线程调用EnterCriticalSection函数进入临界区后,必须保证最后可以调用LeaveCriticalSection,否则公共区域无法释放,并被其它线程访问。
在MFC中封装了CCriticalSection类,该类提供进入临界区和离开临界区的函数Lock()和Unlock()
Ex:
CCriticalSection cs; //临界区对象
void ThreadFunction()
{
cs.Lock();
// 代码
cs.Unlock();
} //end ThreadFunction
2.互斥量 (Mutex):适合不同进程内多线程访问公共区域或代码段时使用,与临界区相似。
HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes,BOOL bInitialOwner,LPCTSTR lpName);
//创建一个互斥量,返回值为这个互斥量的句柄。mutex的使用参数bInitialOwner表示是否由调用此函数的进程拥有此互斥量
API:
HANDLE OpenMutex(DWORD dwDesiredAccess,BOOL hInheritHandle,LPCTSTR lpName);//打开一个已创建的互斥量
BOOL ReleaseMutex(HANDLE hMutex); //释放
MFC中封装了CMutex类,同样的函数Lock()和Unlock()
3.事件(Event):通过线程间触发事件实现同步互斥
API:
HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes,BOOL bManualReset,BOOL bInitialState,LPCTSTR lpName); //创建一个事件,返回值为事件句柄 参数bManualReset表示是否通过手动重设事件,参数为TRUE,则需要调用ResetEvent重设事件,否则为自动重设
HANDLE OpenEvent(DWORD dwDesizedAccess,BOOL bInheritHandle,LPCTSTR lpName);//打开事件
在MFC中封装了CEvent类,包括SetEvent() 触发事件、PulseEvent 暂停事件、ResetEvent()重设事件及Unlock()释放事件句柄
4.信号量(Semaphore):与临界区和互斥量不同,可以实现多个线程同时访问公共区域数据,原理与操作系统中PV操作类似,先设置一个访问公共区域的线程最大连接数,每有一个线程访问共享区资源数就减一,直到资源数小于等于零。
API:
HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTES,LONG lInitialCount,LONG lMaxmemCount,LPCTSTR lpName);
//创建信号量,返回句柄,参数lInitialCount为信号量资源初始数基数,参数lMaxmemCount为该信号量的最大数
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-36452-1.html
节奏有些乱了
如果它硬要当作经济问题来研究