CreateMutex创建互斥内核对象
2017-06-23 17:10
288 查看
http://blog.sina.com.cn/s/blog_149e9d2ec0102wyr0.html
在编程中我们常使用程序创建一个互斥的内核对象,目的就是为了让这个程序只能运行一次。我们都会有这样一个经历,那就是如果我们的打开一个游戏或者其他应用程序,会发现如果想在打开这个游戏,会出现打不开的情况,那是因为使用的是互斥的方式打开。当然我们在编写程序时也是可以写成进程间共享,就想QQ一样可以同时打开多个应用程序。
1. 我们需要一个关键的函数:CreateMutex().
这个函数的具体信息大家可以自己百度或查找MSDN。此处我仅仅讲解它的使用。
这个函数有三个参数,特别是第三个参数控制时候可以内存共享。如果你写一个名字比如:
HANDLE hNutex = CreateMutex(NULL, FALSE, L"stf"); //表示创建一个名为stf的互斥内核对象,那么这个程序仅仅在同一台计算机上被允许打开一次。如果再次打开就会出现错误。
HANDLE hNutex = CreateMutex(NULL, FALSE, NULL); //表示创建匿名互斥内核对象,那么这个程序就会被允许多次打开。
我们查看一下相关代码:
#include
#include
int _tmain()
{
HANDLE hNutex = CreateMutex(NULL, FALSE, NULL);//创建一个名字叫NULL的互斥内核对象
//匿名内核对象,就是没有名字的内核对象,这种内核对象,不能在进程间共享
//命名内核对象可以在进程间共享
if (ERROR_ALREADY_EXISTS == GetLastError())
{
_tprintf(L"%s\n", L"This is the next instance! and session id is ");
return 0;
}
DWORD sessionid = 0;
ProcessIdToSessionId(GetProcessId(NULL), &sessionid);
_tprintf(L"%s\n", L"This is the first instance! and session id is ");
_gettchar();
return 0;
}
HANDLE hNutex = CreateMutex(NULL, FALSE, L"stf"); //创建命名内核对象。
大家可以通过CreateMutex的第三个参数的修改来确定是哪一个值。
2. 创建本地命名对象和全局命名对象
其实这个还是很简单的如果要创建本地内核对象,只需要在命名对象名字前面加一个Local就行了。如果需要创建全局对象,那么只需要在命名对象前面加一个Global就可。分别如下:
HANDLE hNutex = CreateMutex(NULL, FALSE, L"Local\\stf"); //创建本地内核对象
HANDLE hNutex = CreateMutex(NULL, FALSE, L"Global\\stf"); //创建全局内核对象
但是需要注意的是Session不要轻易使用。即HANDLE hNutex = CreateMutex(NULL, FALSE, L"Session\\stf");少用。
在编程中我们常使用程序创建一个互斥的内核对象,目的就是为了让这个程序只能运行一次。我们都会有这样一个经历,那就是如果我们的打开一个游戏或者其他应用程序,会发现如果想在打开这个游戏,会出现打不开的情况,那是因为使用的是互斥的方式打开。当然我们在编写程序时也是可以写成进程间共享,就想QQ一样可以同时打开多个应用程序。
1. 我们需要一个关键的函数:CreateMutex().
这个函数的具体信息大家可以自己百度或查找MSDN。此处我仅仅讲解它的使用。
这个函数有三个参数,特别是第三个参数控制时候可以内存共享。如果你写一个名字比如:
HANDLE hNutex = CreateMutex(NULL, FALSE, L"stf"); //表示创建一个名为stf的互斥内核对象,那么这个程序仅仅在同一台计算机上被允许打开一次。如果再次打开就会出现错误。
HANDLE hNutex = CreateMutex(NULL, FALSE, NULL); //表示创建匿名互斥内核对象,那么这个程序就会被允许多次打开。
我们查看一下相关代码:
#include
#include
int _tmain()
{
HANDLE hNutex = CreateMutex(NULL, FALSE, NULL);//创建一个名字叫NULL的互斥内核对象
//匿名内核对象,就是没有名字的内核对象,这种内核对象,不能在进程间共享
//命名内核对象可以在进程间共享
if (ERROR_ALREADY_EXISTS == GetLastError())
{
_tprintf(L"%s\n", L"This is the next instance! and session id is ");
return 0;
}
DWORD sessionid = 0;
ProcessIdToSessionId(GetProcessId(NULL), &sessionid);
_tprintf(L"%s\n", L"This is the first instance! and session id is ");
_gettchar();
return 0;
}
HANDLE hNutex = CreateMutex(NULL, FALSE, L"stf"); //创建命名内核对象。
大家可以通过CreateMutex的第三个参数的修改来确定是哪一个值。
2. 创建本地命名对象和全局命名对象
其实这个还是很简单的如果要创建本地内核对象,只需要在命名对象名字前面加一个Local就行了。如果需要创建全局对象,那么只需要在命名对象前面加一个Global就可。分别如下:
HANDLE hNutex = CreateMutex(NULL, FALSE, L"Local\\stf"); //创建本地内核对象
HANDLE hNutex = CreateMutex(NULL, FALSE, L"Global\\stf"); //创建全局内核对象
但是需要注意的是Session不要轻易使用。即HANDLE hNutex = CreateMutex(NULL, FALSE, L"Session\\stf");少用。
相关文章推荐
- 调用CreateMutex创建一个有名的互斥器对象
- WINDOWS API ——CREATEMUTEX——创建互斥对象 http://www.cnblogs.com/wind-net/archive/2012/08/29/2661702.html
- 《Windows via C/C++》学习笔记 —— 内核对象的“线程同步”之“互斥内核对象”
- CreateSemaphore 创建信号灯, 一种内核对象的同步方式
- 创建互斥对象,让程序只运行一个。
- 互斥对象使用CreateMutex
- 如何创建一个在任何进程任何帐户任何会话都能存取的内核对象
- 内核对象 互斥体 CreateMutex 跨进程边界共享内核对象 命名对象 程序单实例
- 3.2.1 创建内核对象
- 内核对象的创建和使用
- 线程同步 互斥量 Mutex 内核对象 CreateMutex
- -【内核对象线程同步】互斥对象内核对象
- 使用内核对象使程序单实例运行:互斥信号量
- 互斥对象内核对象
- TerminateThread 与 该线程创建的内核对象 无关
- 互斥内核对象
- 整理: 如何创建一个在任何进程任何帐户任何会话都能存取的内核对象
- windows笔记-【内核对象线程同步】互斥对象内核对象
- PHP内核探索:创建对象实例
- 创建内核对象的专有命名空间