线程同步(windows平台):信号量

一:介绍

信号量也是系统核心对象,它允许多个线程同一时刻访问同一资源,但需限制同一时刻访问资源的最大线程数目。

信号量遵循规则:
1.当前资源计数大于0,信号量有效。
2.当前资源计数等于0,信号量无效。
3.系统不允许当前资源数量为负。
4.当前资源数量不能大于最大资源数量。

二:函数说明

创建信号量:
    HANDLE   CreateSemaphore( 
        LPSECURITY ATTRIBUTES   lpSemaphoreAttributes,     //安全属性 
        LONG   lInitialCount,                                     //信号量对象的初始值该值必须大于等于0,小于等于lMaximumCount。大于0时,信号量被唤醒。 当释放了一个等待该信号量的线程时,lInitialCount值减1,当调用函数ReleaseSemaphore()时,按其指定的数量加一个值。
        LONG   lMaximumCount,                             //信号量的最大值,必须大于0
        LPCTSTR   lpName                                       //信号量名 
    )
    
获得信号量对象:
    DWORD WaitForSingleObject( 
            HANDLE hHandle,        //事件对象的句柄 
            DWORD dwMilliseconds    //0:测试对象的状态立即返回;INFINITE:对象被触发信号后,函数才会返回
    )

释放信号量:
    BOOL  ReleaseSemaphore(
        HANDLE  hSemaphore,            //信号量句柄
        LONG      lReleaseCount,         //增加个数,大于0,小于信号量最大值
        LPLONG  lpPreviousCount     //可以用来传出先前的资源计数,设为NULL表示不需要传出
    )

三:代码实现

/********************************************************
Copyright (C),  2016-2018,
FileName:		t13
Author:        	woniu201
Email:         	wangpengfei.201@163.com
Created:       	2018/10/24
Description:	线程同步-信号量
********************************************************/
#include <iostream>
#include <Windows.h>

using namespace std;

volatile int number = 1;
HANDLE hSemaphore;

DWORD CALLBACK ThreadFun1(LPVOID pParam)
{
	while (1)
	{
		WaitForSingleObject(hSemaphore, INFINITE);	//等待信号量
		cout << "Thread1:" << number++ << endl;
		ReleaseSemaphore(hSemaphore, 1, NULL);		//信号量的当前资源+1
		if (number >= 1000)
		{
			break;
		}
		
	}
	return 0;
}

DWORD CALLBACK ThreadFun2(LPVOID pParam)
{
	while (1)
	{
		WaitForSingleObject(hSemaphore, INFINITE);   //等待信号量
		cout << "Thread2:" << number++ << endl;
		ReleaseSemaphore(hSemaphore, 1, NULL);		//信号量的当前资源+1
		if (number >= 1000)
		{
			break;
		}
	}
	return 0;
}


int main()
{
	//创建自动事件
	hSemaphore = CreateSemaphore(NULL, 1, 1, NULL);

	CreateThread(NULL, 0, ThreadFun1, NULL, 0, NULL);
	CreateThread(NULL, 0, ThreadFun2, NULL, 0, NULL);

	getchar();
	return 1;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农code之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值