孙鑫MFC深入详解 第十五章 多线程(三)

来源:互联网 发布:淘宝破损补寄规则 编辑:程序博客网 时间:2024/06/05 18:13

对命名互斥对象进行实例讲解,代码如下:

MultiThread5.cpp

#include <windows.h>#include <iostream>using namespace std ;DWORD WINAPI ThreadProc1(LPVOID lpParameter) ;DWORD WINAPI ThreadProc2(LPVOID lpParameter) ;int index ;int tickets = 100 ;HANDLE hMutex ;// 声明一个全局的互斥对象句柄int main(){HANDLE hThread1 ;HANDLE hThread2 ;hMutex = CreateMutex(NULL, TRUE, "Mutex") ;// 创建一个属于当前线程的命名的互斥对象if (hMutex){if (ERROR_ALREADY_EXISTS == GetLastError()){cout << "Only one instances can run !" << endl ;return 0 ;}}hThread1 = CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL) ;hThread2 = CreateThread(NULL, 0, ThreadProc2, NULL, 0, NULL) ;CloseHandle(hThread1) ;// 关闭线程内核对象句柄, 并没有阻止新建线程的结束, 但是将线程内核对象的引用计数减1, CloseHandle(hThread2) ;// 当新建线程执行完成后, 引用计数也会减1。 当引用计数为0时, 系统就会释放线程内核对象WaitForSingleObject(hMutex, INFINITE) ;ReleaseMutex(hMutex) ;// 释放当前线程对互斥对象的所有权ReleaseMutex(hMutex) ;Sleep(4000) ;return 0 ; }DWORD WINAPI ThreadProc1(LPVOID lpParameter) {WaitForSingleObject(hMutex, INFINITE) ;cout << "thread1 is running..." << endl ;return 0 ;}DWORD WINAPI ThreadProc2(LPVOID lpParameter) {WaitForSingleObject(hMutex, INFINITE) ;cout << "thread2 is running..." << endl ;return 0 ;}

程序执行如下:

 

可能有人会有疑问,为什么运行的结果会要运行两次呢?   其实,对于命名的互斥对象的最大的用处就是判断当前情况下应用程序是否已经有实例存在。可能有点说不清,举个例子吧,我们有用过某些软件,当我们第一次打开时,我们再次去双击运行时,出现的就是我们第一次打开时的程序,而不会在去创建一个该程序的应用实例。而命名的互斥对象就是实现这种功能的。


分析:

当我们第一次执行MultiThread5.cpp时,线程一、线程二执行,我们便创建了一个该程序的实例,当我们不要关闭该实例,在次去执行MultiThread5.cpp时,程序通过判断函数CreateMutex()的返回值ERROR_ALREADY_EXISTS来判断此时已经有了一个本程序的实例存在,便执行第23、24行代码,这样,输出的就是上图中窗口二中的内容

而不会去执行线程一和线程二了。



0 0
原创粉丝点击