CreateMutex和WaitForSingleObject组合的有关问题

CreateMutex和WaitForSingleObject组合的问题
在网上看见一个dll的代码,其中有这样几行 
case   DLL_PROCESS_ATTACH:   
........ 
hmutex=CreateMutex(NULL,FALSE,NULL);//1 
WaitForSingleObject(hmutex,INFINITE);//2 
...... 
ReleaseMutex//3 

按照我的理解,程序应该停在2处,因为其他地方没有ReleaseMutex,所以对代码的意义感到很奇怪,后来自己写了一个EXE 
hmutex=CreateMutex(NULL,FALSE,NULL);//1 
WaitForSingleObject(hmutex,INFINITE);//2 
Printf( "result ")//3 
结果是很顺利的输出了result,请教原因!谢谢!

------解决方案--------------------------------------------------------
第一,CreateMutex时,第二个参数为FALSE,表示创建者不占有Mutex。这时Mutex的状态是有信号的,所有的wait function将返回。如果第二个参数为TRUE,表示创建者占有了Mutex,这时Mutex的状态是无信号的。其它线程中的wait function将阻塞。 

第二,Mutex用于线程之间的同步,在同一线程中执行你上面的语句,不论第二个参数为TRUE或FALSE,wait function都是返回的。 

也就是说如果你在第1个线程里执行 
hmutex=CreateMutex(NULL,TRUE,NULL);//1 
而在另一个线程中执行 
WaitForSingleObject(hmutex,INFINITE);//2 
如果第一个线程不ReleaseMutex(),第二个线程将一直被阻塞。

https://www.cnblogs.com/railgunman/p/6713119.html

include <windows.h>
#include <iostream.h>
DWORD WINAPI Fun1Proc(LPVOID lpParameter);
DWORD WINAPI Fun2Proc(LPVOID lpParameter);
int index=0;
int tickets=100;
HANDLE hMutex;

void main()
{
 HANDLE hThread1;
 HANDLE hThread2;

 hMutex=CreateMutex(NULL,TRUE,NULL); //FALSE意思为没有被占用,有信号状态  +1
 WaitForSingleObject(hMutex,INFINITE);// +1
 ReleaseMutex(hMutex);                // -1
 ReleaseMutex(hMutex);                // -1

 hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
 hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
 CloseHandle(hThread1);
 CloseHandle(hThread2);
 Sleep(4000);
}
DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
 while(TRUE)
 {      
    WaitForSingleObject(hMutex,INFINITE);
    if(tickets>0)
    {  
    Sleep(1);//放弃执行权利另一个线程运行
    cout<<"thread1 sell the ticket: "<<tickets--<<endl;
    }
   else
    break; 
   ReleaseMutex(hMutex);
 }
 return 0;
}


DWORD WINAPI Fun2Proc(LPVOID lpParameter)
{
 while(TRUE)
 { 
    WaitForSingleObject(hMutex,INFINITE);
  if(tickets>0)
  {  
   Sleep(1);
   cout<<"thread2 sell the ticket: "<<tickets--<<endl;
  }
  else
   break; 
  ReleaseMutex(hMutex);
 }
 return 0;
}

关于WaitForSingleObject(hMutex,INFINITE);内部会有一个计数器,根据申请或者释放自行加减1 hMutex=CreateMutex(NULL,TRUE,NULL);   若设置为TRUE,申请同时就被主线程占用。

hMutex=CreateMutex(NULL,FALSE,NULL);  若设置为FALSE,则申请后不被占用。

 上文例子中的计数器加减情况如下。

   hMutex=CreateMutex(NULL,TRUE,NULL);//FALSE意思为没有被占用,有信号状态  +1                 

   WaitForSingleObject(hMutex,INFINITE);      // +1                 

   ReleaseMutex(hMutex);                                 // -1                 

   ReleaseMutex(hMutex);                                 // -1

由于上述例子中,waitforsingleobject是放在主线程上,所以线程Fun1Proc和Fun2Proc必须要在主线程的计数器为0的时候才能申请到“位置”,若不为零,不可以轮到1,2执行。

http://blog.sina.com.cn/s/blog_6cbbf04b0100wijd.html

原文地址:https://www.cnblogs.com/leijiangtao/p/4540216.html