Windows多线程程序设计之线程同步分析(结合互斥对象)(下)
2013-06-23 15:02
429 查看
本篇中,我将对命名互斥对象进行实例讲解,代码如下:
可能有人会有疑问,为什么运行的结果会要运行两次呢? 其实,对于命名的互斥对象的最大的用处就是判断当前情况下应用程序是否已经有实例存在。可能有点说不清,
举个例子吧,我们有用过某些软件,当我们第一次打开时,我们再次去双击运行时,出现的就是我们第一次打开时的程序,而不会在去创建一个该程序的应用实例。而命
名的互斥对象就是实现这种功能的。
分析:
当我们第一次执行MultiThread5.cpp时,线程一、线程二执行,我们便创建了一个该程序的实例,当我们不要关闭该实例,在次去执行MultiThread5.cpp时,程序通过判断
函数CreateMutex()的返回值ERROR_ALREADY_EXISTS来判断此时已经有了一个本程序的实例存在,便执行第23、24行代码,这样,输出的就是上图中窗口二中的内容
而不会去执行线程一和线程二了。
#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 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 << "thread one is running..." << endl ; return 0 ; } DWORD WINAPI ThreadProc2(LPVOID lpParameter) { WaitForSingleObject(hMutex, INFINITE) ; cout << "thread two is running..." << endl ; return 0 ; }程序执行如下:
可能有人会有疑问,为什么运行的结果会要运行两次呢? 其实,对于命名的互斥对象的最大的用处就是判断当前情况下应用程序是否已经有实例存在。可能有点说不清,
举个例子吧,我们有用过某些软件,当我们第一次打开时,我们再次去双击运行时,出现的就是我们第一次打开时的程序,而不会在去创建一个该程序的应用实例。而命
名的互斥对象就是实现这种功能的。
分析:
当我们第一次执行MultiThread5.cpp时,线程一、线程二执行,我们便创建了一个该程序的实例,当我们不要关闭该实例,在次去执行MultiThread5.cpp时,程序通过判断
函数CreateMutex()的返回值ERROR_ALREADY_EXISTS来判断此时已经有了一个本程序的实例存在,便执行第23、24行代码,这样,输出的就是上图中窗口二中的内容
而不会去执行线程一和线程二了。
相关文章推荐
- Windows多线程程序设计之线程同步分析(结合互斥对象)(中)
- Windows多线程程序设计之线程同步分析(结合临界区(关键代码段))
- Windows多线程程序设计之线程同步分析(结合事件对象)(上)
- Windows多线程程序设计之线程同步分析(结合互斥对象)(上)
- windows多线程系列002_利用互斥对象实现线程同步
- Windows多线程程序设计之线程同步分析(结合事件对象)(下)
- Windows多线程总结(4)-- 线程同步(使用互斥对象实现线程同步 只运行一个对象)
- 结合简单demo分析线程及多线程的使用
- Windows 的多线程程序设计初步
- windows程序设计「BLOWUP.C」范例分析笔记
- windows 程序设计之「NetTime.C」范例分析笔记
- Windows的多线程程序设计初步
- 重新想象 Windows 8 Store Apps (47) - 多线程之线程同步: Semaphore, CountdownEvent, Barrier, ManualResetEvent, AutoResetEvent
- windows程序设计 「PopPad3」之 POPPRNT.C 打印范例分析 笔记
- windows平台的多线程同步互斥:从内核源码分析----小话多线程(3)
- Windows程序设计「MDIDemo」 范例分析笔记
- windows程序设计:多任务与多线程
- 多线程程序设计之创建线程(Windows下C++实现)
- 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLock
- Windows的多线程程序设计初步