WaitForSingleObject函数是如何实现互斥功能的,谁和谁互斥,最好说的详细一点。非常感谢! WaitForSingleObject试图获得指定对象的控制权,如果指定对象被占用,则挂起直到超时。当多线程访问同一对象时可以使用WaitForSingleObject访问互斥对象,如果用MFC的同步对象时,建议使用CSingleLock。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 那在具体应用时,hmutex和event又有什么区别呢? 建立信号灯 互斥量等 ,在多线程里调用WaitForSingleObject,达到同步或互斥。互斥量的简单例子,互斥一般就是线程之间的互斥,就是资源的抢占HANDLE g_hMutex = NULL;g_hMutex = CreateMutex(NULL,FALSE,NULL);HANDLE hThread[2];hThread[0] = CreateThread(.....);hThread[1] = CreateThread(.....);................CloseHandle(hThread[0]);CloseHandle(hThread[1]);CloseHandle(g_hMutex);在线程里:DWORD dw=WaitForSigleObject(g_hMutex,INFINITE);............. 先建立一个同步对象信号灯,初始化其最大值如1(跟MUTEX一样),这样只能有一个线程得到资源,在每个线程中用waitforsingleobject获得资源的控制权,可以设定时间或无限等待。 WaitForSingleObject本身只是一个等待函数而已,与“互斥”无关。Mutex是互斥对象,Event是事件对象。Mutex对象的特点就是,如果一个线程拥有它的话,如果它不释放,别人都无法再占有它,具体到Windows操作系统的实现,就是其他用WaitForSingleObject等待Mutex拥有权的线程全被挂起。Event事件的特点就是状态,可以简单的描述为“点亮”,即如果没有人“点亮”一个Event的话,所有用WaitForSingleObject等待Event事件的线程都将被挂起。区别于是就显而易见了:假如同时有n个线程请求Mutex或Event,那么当Mutex被Owner thread释放时,接下来将只有一个线程可能获得Mutex的拥有权,其他线程继续等待;另一方面,如果是一个Event被激发,那么所有等待的线程就都满足条件了(当然,如果Event设定为Auto-Reset就是另一回事了)。此外,Mutex强调“所有权”的概念,它是归某一个线程所有的,这个线程即使在释放Mutex之前调用WaitForSingleObject也不会被阻塞——因为它已经拥有Mutex;同理,没有拥有Mutex的线程即使调用ReleaseMutex也毫无意义。但Event没有这个概念,如果它没有被Set,那么无论是谁,只要调用WaitForSingleObject都会阻塞——这是一个“陷阱”,搞不好就会造成deadlock;反过来,不像ReleaseMutex只能被owner thread调用,SetEvent可以被任何人调用。另外,Windows提供的同步机制还有Critical Section、Samphore等,这些都是操作系统的基本概念,Windows只是一种具体的实现罢了。 能不能判断一个mutex在某一个时刻是被那一个线程占用,如果把CreateEvent的第二个残书设为false,那一个占用mutex的线程在结束的时候是不是就会自动的释放这个mutex。还有什么样的操作会使一个mutex成为有信号的。 CreateEvent是产生Event对象,不是Mutex。CreateMutex没有BOOL型参数。CreateEvent的第二个参数设置为FALSE的话,Event对象处于Auto-Reset状态,即一旦有一个WaitForSingleObject满足,线程退出等待,但Event对象马上又被置为unsignaled状态,使得其它线程继续等待,这样就实现了“某一时刻只有一个线程可以退出等待”这种效果。一个占有Mutex的线程在退出之前即使没有调用ReleaseMutex,在它结束之后Mutex仍然会被释放,但这时的Mutex处于一种特殊的被释放状态——Abandened,Wait函数会返回WAIT_ABANDONED,但这并不影响以后对Mutex的使用。 IO完成端口正确关闭连接? VC6.0如何获取ORACLE 11g中NUMBER(38)中的字段值 求助:重心(形心)的问题 m_spInPlaceSite 的区别m_spClientSite 一出手就是百分,急,向指定另一窗口发送鼠标单击消息失败 求《windows核心编程》源代码 关闭进程问题 VC中是否提供EDIT类的控件,直接处理IP地址格式的输入输出? 各位大侠请了,关于ActiveX控件的问题。 用到CrystalReport控件的安装盘怎么做? 请问C/S架构的概念,跟B/S架构的关键区别(请具体说明) 如何把多个tif图象合成一个tif图象?
互斥量的简单例子,互斥一般就是线程之间的互斥,就是资源的抢占
HANDLE g_hMutex = NULL;
g_hMutex = CreateMutex(NULL,FALSE,NULL);
HANDLE hThread[2];
hThread[0] = CreateThread(.....);
hThread[1] = CreateThread(.....);
................
CloseHandle(hThread[0]);
CloseHandle(hThread[1]);
CloseHandle(g_hMutex);在线程里:
DWORD dw=WaitForSigleObject(g_hMutex,INFINITE);
.............
Mutex对象的特点就是,如果一个线程拥有它的话,如果它不释放,别人都无法再占有它,具体到Windows操作系统的实现,就是其他用WaitForSingleObject等待Mutex拥有权的线程全被挂起。
Event事件的特点就是状态,可以简单的描述为“点亮”,即如果没有人“点亮”一个Event的话,所有用WaitForSingleObject等待Event事件的线程都将被挂起。区别于是就显而易见了:假如同时有n个线程请求Mutex或Event,那么当Mutex被Owner thread释放时,接下来将只有一个线程可能获得Mutex的拥有权,其他线程继续等待;另一方面,如果是一个Event被激发,那么所有等待的线程就都满足条件了(当然,如果Event设定为Auto-Reset就是另一回事了)。此外,Mutex强调“所有权”的概念,它是归某一个线程所有的,这个线程即使在释放Mutex之前调用WaitForSingleObject也不会被阻塞——因为它已经拥有Mutex;同理,没有拥有Mutex的线程即使调用ReleaseMutex也毫无意义。但Event没有这个概念,如果它没有被Set,那么无论是谁,只要调用WaitForSingleObject都会阻塞——这是一个“陷阱”,搞不好就会造成deadlock;反过来,不像ReleaseMutex只能被owner thread调用,SetEvent可以被任何人调用。另外,Windows提供的同步机制还有Critical Section、Samphore等,这些都是操作系统的基本概念,Windows只是一种具体的实现罢了。