第一个多线程程序

 

 

 

#include<windows.h>
#include <iostream>


DWORD WINAPI fun1Proc(
	LPVOID lpParameter  //thread data
);
DWORD WINAPI fun2Proc(
	LPVOID lpParameter  //thread data
);
int index = 0;
int tickets = 100;
HANDLE hMutex;
using namespace std;
int  main()
{
	HANDLE hThread1;
	HANDLE hThread2;
	hThread1 = CreateThread(NULL, 0, fun1Proc, NULL, 0, NULL);
	hThread2 = CreateThread(NULL, 0, fun2Proc, NULL, 0, NULL);
	CloseHandle(hThread1);
	CloseHandle(hThread2);
	hMutex = CreateMutex(NULL, FALSE, NULL);

	Sleep(4000);
	return 0;

}

//线程1的入口函数
DWORD WINAPI fun1Proc(
	LPVOID lpParameter  //thread data
)
{

	while (true)
	{
		WaitForSingleObject(hMutex, INFINITE);
		if (tickets>0)
		{
			cout << "thread1 sell ticket:" << tickets-- << endl;
		}
		else
		{
			break;
		}
		ReleaseMutex(hMutex);
	}
	return 0;
}


//线程2的入口函数
DWORD WINAPI fun2Proc(
	LPVOID lpParameter  //thread data
)
{

	while (true)
	{
		WaitForSingleObject(hMutex, INFINITE);
		if (tickets > 0)
		{
			cout << "thread2 sell ticket:" << tickets-- << endl;
		}
		else
		{
			break;
		}
		ReleaseMutex(hMutex);
	}
	return 0;
}


1

HANDLE hMutex;

hMutex = CreateMutex(NULL,FALSE,NULL);

是创建一个互斥对象句柄,用处是配合WaitForSingleObject(hMutex,INFINITE).当线程1和2运行到此句的时候都会等待,除非所等待的互斥对象:hMutex处于有信号状态,线程才会继续执行下去。

当代码操作完之后应调用ReleaseMutex函数释放当前线程对互斥对象的所有权,这时,操作系统将该互斥对象的的线程ID置为0,然后将该互斥对象设为有信号状态(当互斥对象被使用时,置为无信号状态,哪里使用WaitForSingleObject()此时的互斥对象hMutex的ID就置为当前进程中)。

 

2

若我们将主程序中hMutex = CreateMutex(NULL, FALSE, NULL),将FALSE改为TRUE此时,hMutex 拥有调用它线程的ID(本程序时mainID),这时运行程序发现两个线程都不运行,因为main一直占用hMute没有释放,hMute一直处于无信号状态,若在    hMutex = CreateMutex(NULL, TRUE, NULL);后加上ReleaseMutex(hMutex);则线程继续运行。

对互斥对象来说,谁拥有谁释放

3

int  main()
{
	HANDLE hThread1;
	HANDLE hThread2;
	hThread1 = CreateThread(NULL, 0, fun1Proc, NULL, 0, NULL);
	hThread2 = CreateThread(NULL, 0, fun2Proc, NULL, 0, NULL);
	CloseHandle(hThread1);
	CloseHandle(hThread2);
	hMutex = CreateMutex(NULL, TRUE, NULL);
	WaitForSingleObject(hMutex, INFINITE);
	ReleaseMutex(hMutex);
	
	//ReleaseMutex(hMutex);
	Sleep(4000);
	return 0;

}

当调用WaitForSingleObject函数请求互斥对象时,操作系统需要判断当前请求互斥对象的线程ID是否与互斥对象当前拥有这的线程ID相等若相等,即使该互斥处于未通知状态,调用线程仍然能有获得其拥有权。

当主线程拥有该互斥对象时,该对象就处于未通知状态,当主线程调用WaitForSingleObject函数请求该互斥对象的所有权时,因为请求的线程ID与和该互斥对象当前所有者的线程ID时相同时,所以仍然能够请求到这个互斥对象,操作系统通过互斥对象内部的计数器来维护同一个线程请求到该互斥对象的的次数,于是计数器加1,这是计数器为2(当固定main函数ID时计算器+1,调用WaitForSingleObject时+1所以为2,计算器只有在为0时WaitForSingleObject才通过不等待)。所以需要调用两次ReleaseMutex将计数器减为0,这是互斥对象hMutex有信号,才能被线程接受。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值