孙鑫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
- 孙鑫MFC深入详解 第十五章 多线程(三)
- 孙鑫MFC深入详解 第十五章 多线程(一)
- 孙鑫MFC深入详解 第十五章 多线程(二)
- 《VC++深入详解》学习笔记 第十五章 多线程
- 第十五章 字符串(三)
- MFC多线程编程(三)
- 孙鑫《vc ++深入详解》第三章mfc框架程序剖析
- 孙鑫VC++深入详解(2):mfc框架程序剖析
- 第十五章之(三)RTTI
- MFC多线程与线程同步 (三)
- MFC(多线程与聊天程序,孙鑫C++第十五讲笔记整理)
- Java 多线程详解(三)
- Java多线程详解(三)
- MFC多线程编程详解
- 第十五周任务(三)
- 第十五周任务(三)
- 第十五周任务(三)
- 三. MFC中的多线程开发
- const成员变量
- android 物理按键
- luajit command line
- centos 7 下搭建svn server及使用方法
- 近期使用json总结的一些小技巧
- 孙鑫MFC深入详解 第十五章 多线程(三)
- Phonegap踩过的坑
- 特性 instrumentation 实践
- MyEclipse断点调试(debug),不进源文件,弹出新类
- coreos集群搭建,以及flannel服务安装和mpi应用测试
- Wget与crontab组合定时任务的用法……
- likely和unlikely函数
- 【并查集】判断是否为树
- Android消息处理框架:Looper,Handler,MessageQueue ...