您的位置:首页 > 其它

Windows多线程程序设计之线程同步分析(结合互斥对象)(下)

2013-06-23 15:02 429 查看
本篇中,我将对命名互斥对象进行实例讲解,代码如下:

#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行代码,这样,输出的就是上图中窗口二中的内容

而不会去执行线程一和线程二了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: