线程同步的四种方式(二)

  1. 信号量
    信号量是一个非负整数(车位数),所有通过它的线程/进程(车辆)都会将该整数减一(通过它使得资源被使用了1个),当该整数值为零时,所有试图通过它的线程(车辆)都将处于等待状态。在信号量上我们定义两种操作: Wait(等待函数) 和 Release(释放函数)。当一个线程调用Wait操作时,它要么得到资源然后将信号量减一,要么一直等下去(指放入阻塞队列),直到信号量大于等于一时。Release(释放)对应于车辆离开停车场,该操作之所以叫做“释放”是因为释放了由信号量守护的资源(车位)。

#include<iostream>
#include <windows.h>
#include<process.h>
using namespace std;

long g_nNum;
unsigned int _stdcall Fun(void * pPM);

const int THREAD_NUM = 10;
HANDLE g_hThreadParameter; //信号量
CRITICAL_SECTION g_csThreadCode; //临界区

int main()
{	
	g_hThreadParameter = CreateSemaphore(NULL, 0, 1, NULL);   //四个参数依次为:安全属性、 信号量的初始值、信号量的最大值、信号量名
	InitializeCriticalSection(&g_csThreadCode);

	HANDLE handle[THREAD_NUM];
	int i = 0;
	while (i < THREAD_NUM) {
		handle[i] = (HANDLE)_beginthreadex(NULL, 0, Fun, &i, 0, NULL);
		Sleep(1);
		WaitForSingleObject(&g_hThreadParameter, INFINITE);   //mutex的release就是把资源从本线程释放出去,再让其他线程去争抢,releasesemaphore则是通知waitforxxobject的线程可以运行了
		++i;
	}

	WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE);

	DeleteCriticalSection(&g_csThreadCode);
	CloseHandle(g_hThreadParameter);
	
	for (i = 0; i < THREAD_NUM; i++)
		CloseHandle(handle[i]);
	
	return 0;
}


unsigned int _stdcall Fun(void *pPM) {
	int nThreadNum = *(int*)pPM;
	ReleaseSemaphore(g_hThreadParameter, 1, NULL); //信号量++ , 当前资源数量大于0,表示信号量处于触发,等于0表示资源已经耗尽故信号量处于末触发。
	Sleep(50);
	EnterCriticalSection(&g_csThreadCode);
	++g_nNum;
	Sleep(10);//do something
	printf("线程编号为%d 全局资源值为%d\n", nThreadNum, g_nNum);
	LeaveCriticalSection(&g_csThreadCode);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值