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

本篇中,我将对命名互斥对象进行实例讲解,代码如下:

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

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



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值