Win32 线程的创建&信号量临界资源&事件对象

背景:

写了个程序,主要实现的功能为主线程创建两个子线程,之后主线程进入等待事件的循环。子线程1对临界资源cnt的值减2并输出cnt的值。子线程2对cnt的值加1并输出cnt的值,且当cnt为50的时候触发事件对象hend_even,子进程2退出。主线程收到hend_even后杀死子线程1,之后进入scanf阻塞。。。

代码示例:

#include <windows.h>
#include <stdio.h>

DWORD WINAPI funAproc(LPVOID lpParameter);
DWORD WINAPI funBproc(LPVOID lpParameter);

int cnt=100;			//共享数据
HANDLE hmutex_cnt;		//cnt的信号量锁
HANDLE hend_even;		//事件

void main()
{
	HANDLE th1,th2;
	//false表示当前主线程不拥有该信号,true表示创建该信号后备主线程拥有
	hmutex_cnt = CreateMutex(NULL,FALSE,NULL);
	//第二个参数:
	//true(人工重置事件对象,等待该事件的所有进程都将进入运行
	//false(自动重置事件对象),等待该事件中的一个进程可变为调度
	//第三个参数:
	//true: 创建该事件对象后,触发事件,false:不触发事件。
	hend_even = CreateEvent(NULL,TRUE,FALSE,NULL);

	int x=2;//带参线程
	//funAproc为线程入口,&x为线程函数参数,该参数为(void*)类型,如果多余一个参数可以采用传递结构体的方式
	th1 = CreateThread(NULL,0,funAproc,&x,0,NULL);
	
	th2 = CreateThread(NULL,0,funBproc,NULL,0,NULL);

	while (TRUE)
	{
		if (cnt == 0) break;
		//Sleep(1);
		if(WAIT_OBJECT_0 == WaitForSingleObject(hend_even,100)){//主线程等待th2发出“终止th1的事件”,即hend_even
			TerminateThread(th1,1); //终止线程
			break;
		}
	}
	printf("back to main thread... \n ");
	int i;
	while (scanf("%d",&i))
	{
		;
	}
}

DWORD WINAPI funAproc(LPVOID lpParameter){
	int b,c;
	int k = *(int*)lpParameter;

	while (cnt>0)
	{
		WaitForSingleObject(hmutex_cnt,INFINITE);//获取信号量,对临界资源(cnt)进行W操作
		cnt -= k;
		printf("thread A delete 2 of cnt = %d\n",cnt);
		ReleaseMutex(hmutex_cnt);				//释放信号量
	}
	return 0;
}
DWORD WINAPI funBproc(LPVOID lpParameter){
	while (cnt>0)
	{
		WaitForSingleObject(hmutex_cnt,INFINITE);//获取信号量,对临界资源(cnt)进行W操作
		cnt = cnt + 1;
		printf("thread B add 1 of cnt = %d\n",cnt);

		if (cnt == 50)	//当cnt == 50的时候,终止th1和th2,此时th2触发hend_even事件,并退出
		{
			SetEvent(hend_even);
			printf("proc B stop to sail ticket...\n");
			ReleaseMutex(hmutex_cnt);	//释放信号量
			exit(0);
		}
		ReleaseMutex(hmutex_cnt);		//释放信号量
	}
	return 0;
}

运行结果:

thread A delete 2 of cnt = 98
thread B add 1 of cnt = 99
thread A delete 2 of cnt = 97
thread B add 1 of cnt = 98
thread A delete 2 of cnt = 96
thread B add 1 of cnt = 97
thread A delete 2 of cnt = 95
thread B add 1 of cnt = 96
thread A delete 2 of cnt = 94
thread B add 1 of cnt = 95
thread A delete 2 of cnt = 93
thread B add 1 of cnt = 94
thread A delete 2 of cnt = 92
thread B add 1 of cnt = 93
thread A delete 2 of cnt = 91
thread B add 1 of cnt = 92
thread A delete 2 of cnt = 90
thread B add 1 of cnt = 91
thread A delete 2 of cnt = 89
thread B add 1 of cnt = 90
thread A delete 2 of cnt = 88
thread B add 1 of cnt = 89
...
thread A delete 2 of cnt = 51
thread B add 1 of cnt = 52
thread A delete 2 of cnt = 50
thread B add 1 of cnt = 51
thread A delete 2 of cnt = 49
thread B add 1 of cnt = 50
proc B stop to sail ticket...
proc B stop to sail ticket...
back to main thread...


参考:

http://www.cnblogs.com/1314NNNKKK/p/3386375.html

http://hi.baidu.com/kdlipm/item/005be8eb29d785e1fa42bae5



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值