CREATEMUTEX

HANDLE hMutex; 

hMutex = ::CreateMutex(NULL, FALSE, NULL); 
::WaitForSingleObject(hMutex, INFINITE); // 1 

::WaitForSingleObject(hMutex, INFINITE); // 2

好多初学者都认为,设置为FALSE就是没有获得获得信号。。 其实这是错误的。

真确的理解是:

CreateMutex()函数的第二个参数是FALSE,表示刚刚创建的这个Mutex不属于任何线程 
也就是没有任何线程拥有他,一个Mutex在没有任何线程拥有他的时候,他是处于激发态的, 所以处于有信号状态。

 

 当你调用::WaitForSingleObject(hMutex,   INFINITE);   //   1   
  时本线程获得了互斥量,所以互斥量由有信号变为没信号

调用::ReleaseMutex()是把互斥量变为有信号。

WaitForSingleObject

函数原型为:
DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds);

hHandle为要监视的对象(一般为同步对象,也可以是线程)的句柄; 
dwMilliseconds为hHandle对象所设置的超时值,单位为毫秒; 
  当在某一线程中调用该函数时,线程暂时挂起,系统监视hHandle所指向的对象的状态。如果在挂起的dwMilliseconds毫秒内,线程所等待的对象变为有信号状态,则该函数立即返回;如果超时时间已经到达dwMilliseconds毫秒,但hHandle所指向的对象还没有变成有信号状态,函数照样返回。参数dwMilliseconds有两个具有特殊意义的值:0和INFINITE。若为0,则该函数立即返回;若为INFINITE,则线程一直被挂起,直到hHandle所指向的对象变为有信号状态时为止。

所以第一个::WaitForSingleObject()函数便返回,释放了该线程对Mutex的拥有权,Mutex又会变成激发态,这样就导致了第二个::WaitForSingleObject()函数的返回!

主要区分

CreateEvent

CreateMutex

的区别。mutex是互斥量, event就是用来事件通知的。

因为mutex里面的ReleaseMutex是将设置为没有线程拥有它,有信号;而event里面的resetevent是将设置为无信号.

 

老奎哥:

mutex是互斥量, 一般用在程序只允许系统里面有一个instance的时候,程序一启动就检测这个mutex, 如果有说明该程序已经在运行, 就退出. 否则own这个mutex并继续运行程序
event一般用在通知, 比如一个事情做完了通知另一个线程, 这里的另一个线程一般是在wait这个event
mutex是保护临界区的, 当然你非要拿它等待 事件, 也可以, 但语义不同

就是进程的一个实例. 比如记事本(假设), 第一个记事本启动的时候,mutex没有被创建, 所以第一个记事本程序创建并拥有该mutex, 然后显示UI.然后第二个记事本启动的时候, 发现mutex已经存在, 说明已经有记事本在运行了,那么第二个记事本直接退出.  这样保证系统里只有一个instance

时间: 2024-09-21 03:07:55

CREATEMUTEX的相关文章

用C++解决理发师问题

#include<cstdarg> #include<Windows.h> #include<iostream> #include <cmath> #include<ctime> #define MAX_COUNT 10//最多理发人数 #define CHAIRS 4//店中椅子的总数目 using namespace std; intwaiting=0;          //等待理发的顾客人数 char    close_door;    

四种进程或线程同步互斥的控制方法

进程|控制 很想整理一下自己对进程线程同步互斥的理解.正巧周六一个刚刚回到学校的同学请客吃饭.在吃饭的过程中,有两个同学,为了一个问题争论的面红耳赤.一个认为.Net下的进程线程控制模型更加合理.一个认为Java下的线程池策略比.Net的好.大家的话题一下转到了进程线程同步互斥的控制问题上.回到家,想了想就写了这个东东.  现在流行的进程线程同步互斥的控制机制,其实是由最原始最基本的4种方法实现的.由这4种方法组合优化就有了.Net和Java下灵活多变的,编程简便的线程进程控制手段.  这4种方

在C#中通过P/Invoke调用Win32DLL

  我在自己最近的编程中注意到一个趋势,正是这个趋势才引出本月的专栏主题.最近,我在基于 Microsoft .Net Framework 的应用程序中完成了大量的 Win32 Interop.我并不是要说我的应用程序充满了自定义的 interop 代码,但有时我会在 .Net Framework 类库中碰到一些次要但又繁絮.不充分的内容,通过调用该 Windows API,可以快速减少这样的麻烦. 因此我认为,.Net Framework 1.0 或 1.1 版类库中存在任何 Windows

基于.Net平台应用程序唯一运行实例C#代码实现

程序 概述本文是针对<基于.Net平台应用程序唯一运行实例实现>的补充,文章给出功能实现代码,其中SingleInstance类实现只允许一个实例运行,Program为测试主程序入口.在代码中标识说明文字.完整代码下载. 主要代码SingleInstance.cs文件, using System;using System.IO;using System.Diagnostics;using System.Threading;using System.Reflection;using System

C# API应用整理文档

C# APIC:\ProgramFiles\MicrosoftVisual Studio .NET\ FrameworkSDK\Samples\ Technologies\ Interop\PlatformInvoke\ WinAPIs\CS目录下有大量的调用API的例子.一.调用格式using System.Runtime.InteropServices; //引用此名称空间,简化后面的代码//使用DllImportAttribute特性来引入api函数,注意声明的是空方法,即方法体为空.[D

部署.net平台的程序

程序 部署用.net写的程序时客户系统需要安装对应版本的.net Framework,而VS.NET自带的安装程序项目没有提供一起打包框架的功能,这一点让许多开发者觉得不爽,在csdn论坛上也有人提及如何方便的把.net程序部署到没有安装框架的windows系统上.几个月前下载了Microsoft Visual Studio .NET 2003 引导程序插件(其实这个微软早在2003年底已经提供了,但是我一直没有发现).前段时间把这个插件安装了一下,发现vs.net 2003的菜单和工具栏里面都

ctfmon.exe是什么进程

(注明:ctfmon.exe并非一定是病毒,ctfmon.exe也可能是Microsoft Office产品套装的一部分.它可以选择用户文字输入程序,和微软Office XP语言条.这不是纯粹的系统程序,但是如果终止它,可能会导致不可知的问题.) ctfmon - ctfmon.exe - 进程信息进程文件: ctfmon or ctfmon.exe进程名称: Alternative User Input Services描述: 控制Alternative User Input Text Pro

多线程MultiThread.cpp

// MultiThread.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <windows.h> #include <iostream> using namespace std; int tickets = 100; HANDLE hMutex; DWORD WINAPI Fun1Proc(LPVOID lp); DWORD WINAPI Fun2Proc(LPVOID lp); int _tmain

XP下关于快速切换用户功能的相关编程

不知道大家注意到没有,Windows XP新增加了一个快速切换用户的功能.它可以让您在不注销的情况下在用户之间进行切换,而且每个用户有自己独立的配置文件和桌面.也就是说当您切换到另外一个用户(即用另外一个账号登陆)时,以前的那个用户运行的所有程序都还是在运行的,并没有退出来.这就给我们的开发带来了新的问题.比如您的应用程序提供的功能在多个用户同时运行时发生错误,您必须为应用程序添加代码以检测该情形并作出相应的反应. 1.检测是否有用户正在运行该应用程序 我们平时都使用互斥体的方法来实现只有一个实