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. Android studio 中创建AIDL Service

      1.概述  AIDL在android系统中的作用 AIDL,Android Interface definition language的缩写,它是一种android内部进程通信接口的描写叙述语言, ...

  2. VC下加载JPG/GIF/PNG图片的两种方法

    转载自:http://blog.sina.com.cn/s/blog_6582aa410100huil.html 仅管VC有提供相应的API和类来操作bmp位图.图标和(增强)元文件,但却不支持jpg ...

  3. zookeeper注册中心安装(单机版)

    下载zookeeper-3.4.9.tar.gz wget http://apache.fayea.com/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar. ...

  4. Microsoft.ACE.OLEDB.12.0 及其在 MSSQL中的使用

    1.Microsoft.ACE.OLEDB.12.0 简介 就是一个数据访问接口,用于在office文件和非office应用程序间传输数据.例如 Microsoft Office Access 201 ...

  5. how-to-convert-string-to-localdate

    Few Java examples show you how to convert a String to the new Java 8 Date API – java.time.LocalDate ...

  6. python 安装配置(windows)

    在 Windows 上, 安装 Python 有两种选择. ActiveState 制作了一个 Windows 上的 Python 安装程序称为 ActivePython, 它包含了一个完整的 Pyt ...

  7. Talend 将Oracle中数据导入到hive中,根据系统时间设置hive分区字段

    首先,概览下任务图: 流程是,先用tHDFSDelete将hdfs上的文件删除掉,然后将oracle中的机构表中的数据导入到HDFS中:建立hive连接->hive建表->tJava获取系 ...

  8. C++的iterator与const_iterator

    所有的标准库容器都定义了相应的迭代器类型.迭代器对所有的容器都适用,现代 C++ 程序更倾向于使用迭代器而不是下标操作访问容器元素. 1.iterator,const_iterator作用:遍历容器内 ...

  9. android Binder的优点

    Linux进程间通信的方式: 管道(Pipe) 信号(Signal) 消息队列(Message) 共享内存(Share Memory) 套接字(Socket)中断 Binder Binder 介绍: ...

  10. spring boot下JedisCluster方式连接Redis集群的配置

    最近在使用springboot做项目,使用redis做缓存.在外网开发的时候redis服务器没有使用集群配置,所有就是用了RedisTemplate的方式进行连接redis服务器.但是项目代码挪到内网 ...