【原】MFC多线程之互斥量Mutex

本文探讨了MFC中多线程使用互斥量Mutex的问题。通过一个模拟火车售票的例子,阐述了创建Mutex时指定拥有权的重要性,以及在不同线程中正确释放Mutex的逻辑。同时,提到了WaitForSingleObject函数在判断Mutex状态和线程结束时的作用,以及Mutex在命名后的唯一性,防止多次实例化同一程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先看模拟火车售票的这个程序:

#include "windows.h"
#include <iostream.h>//线程头文件

DWORD WINAPI ThreadProc1(LPVOID lpParameter);
DWORD WINAPI ThreadProc2(LPVOID lpParameter);
int index=0;
int ticket=100;
HANDLE hMutex;//一个互斥量
void main()
{
	HANDLE hThread1=CreateThread(NULL,0,ThreadProc1,NULL,0,NULL);//创建线程,放回HANDLE
	HANDLE hThread2=CreateThread(NULL,0,ThreadProc2,NULL,0,NULL);
	CloseHandle(hThread1);//我们对返回的HANDLE 不关心,要释放,否则计数器会+1
	CloseHandle(hThread2);
	//while(index++<1000)
//	cout<<"main is running"<<endl;
	hMutex=CreateMutex(NULL,FALSE,NULL);//TRUE 表示创建他的拥有他。即主线程拥有这个对象
//你一个参数为安全机制:NULL,第二个为FALSE表示手动指定拥有者,若为TRUE,其拥有者为创建他的进程,这里为main函数
//即主线程 Sleep(4000); } DWORD WINAPI ThreadProc1(LPVOID lpParameter) { // while(index++<1000) // cout<<"Thread1 is running"<<endl; while(TRUE) { WaitForSingleObject(hMutex,INFINITE);//等待互斥量的信号 if(ticket>0) { Sleep(1); cout<<"Thread1 sell ticket"<<ticket--<<endl; } else break; ReleaseMutex(hMutex); } return 0; } DWORD WINAPI ThreadProc2(LPVOID lpParameter) { //while(index++<1000) // cout<<"Thread1 is running"<<endl; while(TRUE) { //互斥有id,会吃对象 WaitForSingleObject(hMutex,INFINITE); if(ticket>0) { Sleep(1); cout<<"Thread2 sell ticket"<<ticket--<<endl; } else break; ReleaseMutex(hMutex);//释放 } return 0; }

  假如为CreateMutex第二个参数为TRUE,表示主线程拥有它,hMutex=CreateMutex(NULL,TRUE,NULL);//TRUE 表示创建他的拥有他。即主线程拥有这个对象

  要是其他线程获得Mutex,必须先要释放:ReleaseMutex(hMutex);//释放

  即:替换红色代码:hMutex=CreateMutex(NULL,TRUE,NULL);ReleaseMutex(hMutex);

     再加入红色代码如下:hMutex=CreateMutex(NULL,TRUE,NULL);WaitForSingleObject(h

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值