CreateMutex() 、ReleaseMutex()

功能

CreateMutex() 用于有独占要求的程序 (在其进程运行期间不允许其他使用此端口设备的程序运行,或不允许同名程序运行)。

比如运行金山词霸时,一次只能运行一个实例,当运行第二个实例时,实际上是激活第一个实例,将其带到最顶层。

原型

1 HANDLE CreateMutex(
2     LPSECURITY_ATTRIBUTES lpMutexAttributes,
3     BOOL bInitialOwner,
4     LPCTSTR lpName
5 );

参数

lpMutexAttributes:必须为NULL

bInitialOwner:如果为TRUE,调用互斥对象的线程获得互斥对象的所有权

         如果为FALSE,则不拥有

lpName:如果lpName跟一个已存在的事件、信号、文件映射对象匹配,即命名的互斥对象已存在,则CreateMutex函数失败,GetLastError()返回ERROR_INVALID_HANDLE。

注解

一旦不再需要,注意必须用CloseHandle函数将互斥体句柄关闭。从属于它的所有句柄都被关闭后,就会删除对象。

进程中止前,一定要释放互斥体(ReleaseMutex(HANDLE)),如不慎未采取这个措施,就会将这个互斥体标记为废弃,并自动释放所有权。共享这个互斥体的其他应用程序也许仍然能够用它,但会接收到一个废弃状态信息,指出上一个所有进程未能正常关闭。

代码

 1 BOOL CBBBApp::SetMutex()
 2 {
 3     BOOL bFound = FALSE;
 4
 5     HANDLE hMutexOneInstance = ::CreateMutex(NULL, TRUE, _T("MutexBBB"));
 6
 7     if (::GetLastError() == ERROR_ALREADY_EXISTS)
 8     {
 9         TRACE(_T("Instance对象已存在"));
10
11         bFound = TRUE;
12         CloseHandle(hMutexOneInstance);
13         hMutexOneInstance = NULL;
14     }
15
16     if (hMutexOneInstance)
17     {
18         ::ReleaseMutex(hMutexOneInstance);
19     }
20
21     if (bFound)
22     {
23         return FALSE;
24     }
25
26     return TRUE;
27 }
时间: 2024-08-07 22:00:39

CreateMutex() 、ReleaseMutex()的相关文章

编程思想之多线程与多进程(4)——C++中的多线程

<编程思想之多线程与多进程(1)--以操作系统的角度述说线程与进程>一文详细讲述了线程.进程的关系及在操作系统中的表现,<编程思想之多线程与多进程(2)--线程优先级与线程安全>一文讲了线程安全(各种同步锁)和优先级,这是多线程学习必须了解的基础.本文将接着讲一下C++中多线程程序的开发.这里主要讲Windows平台线程的用法,创建线程要调用windows API的CreateThread方法. 创建线程 在Windows平台,Windows API提供了对多线程的支持.前面进程和

TLSAlloc()

为什么要有TLS?原因在于,进程中的全局变量与函数内定义的静态(static)变量,是各个线程都可以访问的共享变量.在一个线程修改的内存内容,对所有线程都生效.这是一个优点也是一个缺点.说它是优点,线程的数据交换变得非常快捷.说它是缺点,一个线程死掉了,其它线程也性命不保; 多个线程访问共享数据,需要昂贵的同步开销,也容易造成同步相关的BUG. 如果需要在一个线程内部的各个函数调用都能访问.但其它线程不能访问的变量(被称为static memory local to a thread 线程局部静

Win32多线程程序设计读书笔记

为什么多线程? 多线程并不一定是最好的,合适才是最好的. 多线程主要的优点是价廉物美,启动快.退出快.与其他线程共享核心对象,很容易实现共产主义的伟大梦想.但是其又有不可预期.测试困难的缺点. 使用好多线程,就是要知道何时应该用多线程,何时不该用.如果应该用多线程,如何解决Race Condition问题?如何共享数据?如何提高效率?如何同步线程和数据?总结起来就是: 有始有终,线程的创建和释放都要靠自己 不抛弃不放弃,等一等线程,让它做完自己的工作 文明有序,资源占用无冲突 但是有时候却不建议

@windows 多线程同步技术

使线程同步 临界区 管理事件内核对象  信号量内核对象 互斥内核对象  小结 正文 使线程同步 在程序中使用多线程时,一般很少有多个线程能在其生命期内进行完全独立的操作.更多的情况是一些线程进行某些处理操作,而其他的线程必须对其处理结果进行了解.正常情况下对这种处理结果的了解应当在其处理任务完成后进行. 如果不采取适当的措施,其他线程往往会在线程处理任务结束前就去访问处理结果,这就很有可能得到有关处理结果的错误了解.例如,多个线程同时访问同一个全局变量,如果都是读取操作,则不会出现问题.如果一个

mfc小工具开发之定时闹钟之---多线程急线程同步

一.MFC对多线程编程的支持 MFC中有两类线程,分别称之为工作者线程和用户界面线程.二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环. 工作者线程没有消息机制,通常用来执行后台计算和维护任务,如冗长的计算过程,打印机的后台打印等.用户界面线程一般用于处理独立于其他线程执行之外的用户输入,响应用户及系统所产生的事件和消息等.但对于Win32的API编程而言,这两种线程是没有区别的,它们都只需线程的启动地址即可启动线程来执行任务. 在MFC中,一般用全局函数Afx

多线程与多进程(4)

创建线程 在Windows平台,Windows API提供了对多线程的支持.前面进程和线程的概念中我们提到,一个程序至少有一个线程,这个线程称为主线程(main thread),如果我们不显示地创建线程,那我们产的程序就是只有主线程的间线程程序. 下面,我们看看Windows中线程相关的操作和方法: CreateThread与CloseHandle CreateThread用于创建一个线程,其函数原型如下: HANDLE WINAPI CreateThread( LPSECURITY_ATTRI

C++多线程记录1

本文主要记录C++中多线程程序的开发中调用windows API的CreateThread的使用方法. 创建线程 在Windows平台,Windows API提供了对多线程的支持.前面进程和线程的概念中我们提到,一个程序至少有一个线程,这个线程称为主线程(main thread),如果我们不显示地创建线程,那我们产的程序就是只有主线程的间线程程序. 下面,我们看看Windows中线程相关的操作和方法: CreateThread与CloseHandle CreateThread用于创建一个线程,其

多线程的那点儿事(之windows锁)

在windows系统中,系统本身为我们提供了很多锁.通过这些锁的使用,一方面可以加强我们对锁的认识,另外一方面可以提高代码的性能和健壮性.常用的锁以下四种:临界区,互斥量,信号量,event. (1)临界区 临界区是最简单的一种锁.基本的临界区操作有, [cpp] view plaincopy InitializeCriticalSection EnterCriticalSection LeaveCriticalSection DeleteCriticalSection 如果想要对数据进行互斥操

MFC第三节-多线程

一.程序,进程,线程 程序是指令的集合,以文件形式储存在磁盘上.一个程序可以对应多个进程,一个进程代表一个实例. 进程由管理进程的内核对象.地址空间组成.内核对象存放关于进程的统计信息,地址空间包含可执行模块.DLL模块和堆.栈.进程不执行任何东西,它是线程的容器,每个进程至少有一个线程.当创建一个进程时,操作系统自动创建一个线程—主线程.每个进程有4GB的地址空间,进程之间相互独立. 线程由线程的内核对象和线程栈组成.线程只有一个内核对象和栈,只有很少的内存.同一个进程的线程能共享进程的数据.