Windows同步API (一)—— Mutex
来源:互联网 发布:语音打电话软件 编辑:程序博客网 时间:2024/06/07 18:29
Mutex是互斥体的意思,当一个线程持有一个Mutex时,其它线程申请持有同一个Mutex会被阻塞,因此可以通过Mutex来保证对某一资源的互斥访问(即同一时间最多只有一个线程访问)。
调用CreateMutex可以创建或打开一个Mutex对象,其原型如下
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTES lpMutexAttributes,
BOOL bInitialOwner,
LPCTSTR lpName
);
其中参数lpMutexAttributes用来设定Mutex对象的安全描述符和是否允许子进程继承句柄。bInitialOwner表明是否将Mutex的持有者设置为调用线程。lpName参数设置Mutex的名字,该名字区分大小写并不能包含"/",最大长度为MAX_PATH,可设置为NULL表明该Mutex为匿名对象。
如果调用成功,则返回Mutex的句柄,否则返回NULL,如果lpName不为NULL且调用前同名的Mutex已被创建,则返回同名Mutex的句柄,此时调用GetLastError将返回ERROR_ALREADY_EXISTS,参数bInitialOwner将被忽略。
还可以调用OpenMutex打开创建的非匿名Mutex,原型如下
HANDLE OpenMutex(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
LPCTSTR lpName
);
在成功创建或打开Mutex后,可以使用wait functions来等待并获取Mutex的持有权。
下面的例子用来通过Mutex对象控制某一应用程序只运行一次
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HANDLE hMutex = CreateMutex(NULL, FALSE, "Mutex_Only_One_Instance_Allowed");
if (NULL == hMutex)
{
Error("Create mutex error.");
return -1;
}
DWORD dw = WaitForSingleObject(hMutex, 0);
if (WAIT_FAILED == dw)
{
Error("Wait for mutex error.");
CloseHandle(hMutex); // 释放句柄,当指向同一系统对象的所有句柄释放后,该对象将被删除。
return -1;
}
else if (WAIT_TIMEOUT == dw)
{
// 另外一个实例正在运行
CloseHandle(hMutex);
return 1;
}
// 没有其它实例在运行,本实例将继续运行
// 在此实现必要的功能性代码,如创建窗口,进入消息循环
// ...............
ReleaseMutex(hMutex); // 释放hMutex的持有权,注意这并不等同于删除Mutex对象
CloseHandle(hMutex);
return 0;
}
其中WaitForSingleObject是等待特定对象发出信号(signaled),而Mutex对象在没有任何线程持有时会发出信号。
- Windows同步API (一)—— Mutex
- Windows同步API (一)—— Mutex
- Windows同步API—— Mutex
- Mutex — Windows API
- 同步线程—Mutex
- Windows多线程编程(4)同步对象——Mutex对象
- 线程间同步一 ———— 互斥锁(mutex)
- Windows线程同步之互斥锁(Mutex)
- C++同步技术——Mutex相关 (转)
- 线程、同步与锁——Mutex
- Mutex线程同步 (C/C++ Windows Platform SDK 实现)
- Windows进程同步之互斥量内核对象(Mutex)
- Windows进程同步之互斥量内核对象(Mutex)
- Windows进程的同步之内核对象-互斥量(Mutex)
- 线程的同步之互斥量mutex(一)
- Linux并发与同步(一)原子操作/spinlock/mutex
- [windows][thread] 同步.内核.Mutex.Semaphores等
- Linux线程同步机制一--互斥锁mutex
- 关注SOA in Action
- 什么是VSS——来自百度的词条解释
- 编译2.6.14 并在skyeye1.2.4上运行的步骤
- Breakfast or lunch? 早餐还是午餐?
- MOSS MSN开发群-皮皮1月31日主题:SSRS 与MOSS集成讲座
- Windows同步API (一)—— Mutex
- OASIS宣布在2008年将举行一次关于SOA中的可组合性的研讨会
- 通用日期转化
- 一个GUI例子 Linux ----gshortcut
- 关于微软ADO.NET提供的组件库里的UpdateDataSet()的用法心得
- 中国惠普前总裁孙振耀谈人生
- QT4.3.3+VC6.0安装编译过程详解
- Exception is thrown but exception.getMessage() is null
- C++ Builder 快捷键