Mutex与Event控制互斥事件的使用详解
2014-11-14 13:12
573 查看
最近写一程序,误用了Mutex的功能,错把Mutex当Event用了。
【Mutex】
使用Mutex的主要函数:CreateMutex、ReleaseMutex、OpenMutex、WaitForSingleObject、WaitForMultipleObjects。
CreateMutex:其中第二个参数是表示当前线程拥有权。
TRUE:创建线程获得初始所有权的互斥对象(即信号已被当前线程获得,没有释放前其它线程不能获得。如果当前线程调用了WaitForSingleObject函数,则释放次数等于调用次数加1)。
FALSE:创建线程没有获得互斥对象的所有权。也就是自由争取,看谁先Wait到。
不管怎么样,MUtex的释放规则是:谁拥有谁释放,还有在线程结束时,线程所获得的Mutex自动释放;当然还可以使用命名Mutex做唯一性验证,这个在整个windows生存期下有效。
【Event】
与Mutex不一样,Event是任何时候都是可以操作的,而且没有同调用多次WaitForSingleObject和同时释放多次一说。它的主要操作函数有:CreateEvent、SetEvent、WaitForSingleObject。
CreateEvent参数说明。
第二个参数表示调用WaitForSingleObject后手动(TRUE)/自动(FALSE)为无信号状态。
第三个参数表示初始状态为有(TRUE)/无(FALSE)信号。
Event的获得是通过一个队列去排队获得的,SetEvent没有限制使用,在任何可以调用的地方都可以调用。
Mutex,的互斥是以线程为基本单位,而Event是以代码段为基本单位。所以在两者的使用上有着不同的功能用途。
【测试代码】
世界如此的美好,江山如此的多娇! ---阳光正能量--->>>>>>>>>>>>>>>
【Mutex】
使用Mutex的主要函数:CreateMutex、ReleaseMutex、OpenMutex、WaitForSingleObject、WaitForMultipleObjects。
CreateMutex:其中第二个参数是表示当前线程拥有权。
TRUE:创建线程获得初始所有权的互斥对象(即信号已被当前线程获得,没有释放前其它线程不能获得。如果当前线程调用了WaitForSingleObject函数,则释放次数等于调用次数加1)。
FALSE:创建线程没有获得互斥对象的所有权。也就是自由争取,看谁先Wait到。
不管怎么样,MUtex的释放规则是:谁拥有谁释放,还有在线程结束时,线程所获得的Mutex自动释放;当然还可以使用命名Mutex做唯一性验证,这个在整个windows生存期下有效。
【Event】
与Mutex不一样,Event是任何时候都是可以操作的,而且没有同调用多次WaitForSingleObject和同时释放多次一说。它的主要操作函数有:CreateEvent、SetEvent、WaitForSingleObject。
CreateEvent参数说明。
第二个参数表示调用WaitForSingleObject后手动(TRUE)/自动(FALSE)为无信号状态。
第三个参数表示初始状态为有(TRUE)/无(FALSE)信号。
Event的获得是通过一个队列去排队获得的,SetEvent没有限制使用,在任何可以调用的地方都可以调用。
Mutex,的互斥是以线程为基本单位,而Event是以代码段为基本单位。所以在两者的使用上有着不同的功能用途。
【测试代码】
// Mutex_release.cpp : 定义控制台应用程序的入口点。 // // #include "stdafx.h" #include "iostream" #include "windows.h" using namespace std; DWORD WINAPI ThreadProc1(LPVOID lpParam); DWORD WINAPI ThreadProc2(LPVOID lpParam); HANDLE hEvent = NULL; HANDLE hThread1 = NULL; HANDLE hThread2 = NULL; int main(int argc,char *args[]) { hEvent = CreateEvent(NULL,FALSE,FALSE,NULL); // 使用 *重置为无信号状态,初始化时*信号状态 // hEvent = CreateMutex(NULL, FALSE, NULL); // FALSE: 创建线程没有获得互斥对象的所有权 TRUE: 创建线程获得初始所有权的互斥对象 hThread1 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProc1,NULL,0,NULL); Sleep(200); hThread2 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProc2,NULL,0,NULL); Sleep(200); if (NULL == hThread1 || NULL == hThread2) { cout <<"create thread fail!"; }//DWORD dReturn = WaitForSingleObject(hEvent,INFINITE); //cout<< dReturn << endl; //ReleaseMutex(hEvent); //ReleaseMutex(hEvent); while(1){ Sleep(100); // ReleaseMutex(hEvent); SetEvent(hEvent); } return 0; } DWORD WINAPI ThreadProc1(LPVOID lpParam) { cout <<"in thread1@!"<<endl; DWORD dReturn = WaitForSingleObject(hEvent,INFINITE); if (WAIT_OBJECT_0 == dReturn) { cout <<"thread1 signaled ! "<<endl; } dReturn = WaitForSingleObject(hEvent,INFINITE); if (WAIT_OBJECT_0 == dReturn) { cout <<"thread1 signaled*&* ! "<<endl; } cout <<"in thread1 --signal"<<endl; //SetEvent(hEvent); //ReleaseMutex(hEvent); //ReleaseMutex(hEvent); while(1){ Sleep(100); } return 0; } DWORD WINAPI ThreadProc2(LPVOID lpParam) { cout <<"in thread2@!"<<endl; DWORD dReturn = WaitForSingleObject(hEvent,INFINITE); if (WAIT_OBJECT_0 == dReturn) { cout <<"thread2 signaled ! "<<endl; } cout <<"in thread2--signal"<<endl; //SetEvent(hEvent); //SetEvent(hEvent); //ReleaseMutex(hEvent); while(1){ Sleep(100); } return 0; } //int _tmain(int argc, _TCHAR* argv[]) //{ // //// HANDLE m_hMutex = CreateEvent(NULL,FALSE,TRUE,NULL);// 检查错误代码 // HANDLE m_hMutex = CreateMutex(NULL, TRUE, NULL); // if(m_hMutex == NULL) // { // printf("create no!\n"); // return -1; // } // // printf("create yes!\n"); // WaitForSingleObject(m_hMutex, INFINITE); // printf("wait yes\n"); // // //SetEvent(m_hMutex); // //SetEvent(m_hMutex); // //SetEvent(m_hMutex); // // //ReleaseMutex(m_hMutex); // //ReleaseMutex(m_hMutex); // //ReleaseMutex(m_hMutex); // // WaitForSingleObject(m_hMutex, INFINITE); // printf("wait yes 2\n"); // WaitForSingleObject(m_hMutex, INFINITE); // printf("wait yes 3\n"); // WaitForSingleObject(m_hMutex, INFINITE); // printf("wait yes 4\n"); // WaitForSingleObject(m_hMutex, INFINITE); // printf("wait yes 5\n"); // WaitForSingleObject(m_hMutex, INFINITE); // printf("wait yes 6\n"); // WaitForSingleObject(m_hMutex, INFINITE); // printf("wait yes 7\n"); // return 0; //}
世界如此的美好,江山如此的多娇! ---阳光正能量--->>>>>>>>>>>>>>>
相关文章推荐
- Mutex与Event控制互斥事件的使用详解
- Mutex与Event控制互斥事件的使用详解
- MFC线程(三):线程同步事件(event)与互斥(mutex)
- UCOS-II 事件(event)的使用规则及MUTEX实例整理
- MFC线程(三):线程同步事件(event)与互斥(mutex)
- 互斥量(mutex)与事件(event)的使用
- μCOS-II系统之事件(event)的使用规则及MUTEX实例
- python多线程之事件Event的使用详解
- MFC线程(三):线程同步事件(event)与互斥(mutex)
- C#事件(event)使用方法详解
- 互斥量(mutex)与事件(event)的使用
- 多线程基础之三:使用event, mutex, semaphore实现多进程间互斥
- 详解python多线程、锁、event事件机制的简单使用
- c# 线程同步: 详解lock,monitor,同步事件和等待句柄以及mutex
- c# 线程同步: 详解lock,monitor,同步事件和等待句柄以及mutex
- c# 线程同步: 详解lock,monitor,同步事件和等待句柄以及mutex(ZT)
- JS event使用方法详解
- c# 线程同步: 详解lock,monitor,同步事件和等待句柄以及mutex(ZT)
- 使用EventWaitHandle控制线程间的同步
- 回发或回调参数无效。在配置中使用 或在页面中使用 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEvent