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

CreateMutex和WaitForSingleObject组合的有关问题的更多相关文章

  1. MFC常用函数总结

    1.MFC编辑框.静态文本框相关的常用函数 <1>GetDlgItemText(ID ,str) 作用:从对话框中获取文本 第一个参数为要获取的编辑框(或者静态文本框.单选按钮等可以显示内 ...

  2. 如何创建一个简单的C++同步锁框架(译)

    翻译自codeproject上面的一篇文章,题目是:如何创建一个简单的c++同步锁框架 目录 介绍 背景 临界区 & 互斥 & 信号 临界区 互斥 信号 更多信息 建立锁框架的目的 B ...

  3. 孙鑫VC学习笔记:多线程编程

    孙鑫VC学习笔记:多线程编程 SkySeraph Dec 11st 2010  HQU Email:zgzhaobo@gmail.com    QQ:452728574 Latest Modified ...

  4. 多进程之间的互斥信号量实现(Linux和windows跨平台)

    多线程之间实现互斥操作方式很多种,临界区(Critical Section),互斥量(Mutex),信号量(Semaphore),事件(Event)等方式 其中临界区,互斥量,信号量算是严格意义的实现 ...

  5. C++ MFC常用函数(转)

    WinExec() ExitWindowsEx() GlobalMemoryStatus() GetSystemInfo() GetSystemDirectory() GetWindowsDirect ...

  6. Windows核心编程:第9章 用内核对象进行线程同步

    Github https://github.com/gongluck/Windows-Core-Program.git //第9章 用内核对象进行线程同步.cpp: 定义应用程序的入口点. // #i ...

  7. 【API】网络编程模型、多线程

    1.网络通信编程 1)网络通信模型基础知识 TCP Server: WSAStartup() socket() bind() linsten() accept() send/recv() closes ...

  8. 多进程之间的互斥信号量的实现(Linux和windows跨平台)

    最近工作中遇到了一些关于文件读取权限的问题.当一个程序中对一个固定名称的文件做了读写的操作的时候,外界通过并发式的调用这个应用的时候,可能存在多个进程同时去操作这个文件,这个时候可能会造成调用失败的问 ...

  9. 常见MFC函数

    1.MFC常用函数:WinExec()ExitWindowsEx()GlobalMemoryStatus()GetSystemInfo()GetSystemDirectory()GetWindowsD ...

随机推荐

  1. 【转】Swift 语言的设计错误

    Swift 语言的设计错误 在『编程的智慧』一文中,我分析和肯定了 Swift 语言的 optional type 设计,但这并不等于 Swift 语言的整体设计是完美没有问题的.其实 Swift 1 ...

  2. systemctl 命令

    systemctl命令是系统服务管理器指令,它实际上将 service 和 chkconfig 这两个命令组合到一起. 任务 旧指令 新指令 使某服务自动启动 chkconfig --level 3 ...

  3. winform中键盘和鼠标事件的捕捉和重写

    在编写winform应用程序时,有时需要无论在哪个控件获取焦点时,对某一个键盘输入或者鼠标事件都进行同样的操作.比如编写一个处理图片的应用程序时,希望无论当前哪个控件获得焦点,当用户按上.下.左.右键 ...

  4. Android 获取自带浏览器上网记录

    先是搜索了一下,在manifest里添加 <uses-permission android:name="com.android.browser.permission.READ_HIST ...

  5. cocos2d-x 模态对话框的实现

    心情不好,恩.不扯淡了.直接讲. ================================== 在泰然看了一篇实现模态对话框的文章,写的还不错,然后在其基础上加了我简单加了一层灰色透明背景,这 ...

  6. 用Power BI观察经济与健康的关系

    Hans Rosling是卡罗琳学院的国际卫生学教授.这位学者与众不同的技能是数据可视化.以直观的数据展现了令人信服的世界观,而且在gapminder.org提供无偿展示以及下载.假设你没有看过下面的 ...

  7. 【转】JPA project Change Event Handler / 导致eclipse十分卡

    这是Eclipse中的一个GUG: Bug 386171 - JPA Java Change Event Handler (Waiting) 解决方法: 1.) 退出Myeclipse(或eclips ...

  8. EMIT 动态创建类型

    https://www.cnblogs.com/xiaodlll/p/4029051.html  值得一读

  9. 四大Java EE容器(Tomcat、JBoss、Resin、Glassfish)之简单比较

    转自:http://www.cxybl.com/html/bcyy/java/201106241007.html 现在流行的Java EE容器有很多:Tomcat.JBoss.Resin.Glassf ...

  10. Session的clear方法和flush方法

    Session Clear()与 Flush() 解释 1.Clear 方法  无论是Load 还是 Get 都会首先查找缓存(一级缓存) 如果没有,才会去数据库查找,调用Clear() 方法,可以强 ...