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

Windows中的多线程程序设计一直是所有编程人员感到困难的一个地方,主要是在Windows多线程程序设计中,往往要考虑很多的东西,线程启用的多少,线程之间的同

步问题等等...   这里我将将我学习过程中碰到的问题总结在此,如果有遇到相同困惑的人也能够尽快的明白过来。


MultiThread1.cpp

#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 ;

	hThread1 = CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL) ;
	hThread2 = CreateThread(NULL, 0, ThreadProc2, NULL, 0, NULL) ;
	CloseHandle(hThread1) ;		// 关闭线程内核对象句柄, 并没有阻止新建线程的结束, 但是将线程内核对象的引用计数减1, 
	CloseHandle(hThread2) ;		// 当新建线程执行完成后, 引用计数也会减1。 当引用计数为0时, 系统就会释放线程内核对象
					// 如果此处不使用CloseHandle()函数关闭新建线程内核对象, 则在该线程执行完成后, 其引用计数也不会为0,
					// 则该线程内核对象会一直存在在系统内核当中, 所以, 在我们创建了一个新线程之后, 如果后面的代码不会
					// 用到此线程内核对象, 则应该调用CloseHandle()函数关闭该线程的线程内核对象

	hMutex = CreateMutex(NULL, FALSE, NULL) ;	// 创建一个不属于当前线程的匿名互斥对象

	Sleep(4000) ;

	return 0 ; 
}

DWORD WINAPI ThreadProc1(LPVOID lpParameter) 
{	
	while (TRUE)
	{
		WaitForSingleObject(hMutex, INFINITE) ;
		if (tickets > 0)
		{
			Sleep(1) ;
			cout << "thread one sell ticket: " << tickets-- << endl ;
		}
		else 
			break ;

		ReleaseMutex(hMutex) ;		// 释放hMutex互斥对象的所有权
	}

	return 0 ;
}

DWORD WINAPI ThreadProc2(LPVOID lpParameter) 
{
	while (TRUE)
	{
		WaitForSingleObject(hMutex, INFINITE) ;
		if (tickets > 0)
		{
			Sleep(1) ;
			cout << "thread two sell ticket: " << tickets-- << endl ;
		}
		else 
			break ;

		ReleaseMutex(hMutex) ;
	}
	
	return 0 ;
}


代码如上,我们先看看运行的结果,如下:


我们可以看到线程一和线程二之间交替的执行,直到将票卖完。   那么这样的结果,肯定是缺少不了线程之间的同步,那么Windo

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值