• 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

  • 相关阅读:
    cJSON获取bool值
    电视节目rtmp流
    huggingface. doc
    Huggingface🤗NLP笔记3:Pipeline端到端的背后发生了什么
    nemo代码
    《Huggingface Transformers实战教程 》
    LIC2021 DuIE 关系抽取基线
    PaddleNLP实战——信息抽取(InfoExtraction)
    NVIDIA NeMo:一个开源工具包,可通过三行代码开发最先进的会话式AI模型
    开发一个会说中文的问答机器人需要几步?英伟达技术专家教你上手
  • 原文地址:https://www.cnblogs.com/leijiangtao/p/4540216.html
Copyright © 2020-2023  润新知