mutex的使用_mutex semaphore区别_c mutex使用

电脑杂谈  发布时间:2017-03-08 13:06:44  来源:网络整理

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

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...