当前位置: 首页 > news >正文

c++介绍信号六

信号量是c++中实现对有限资源访问控制,现成通过信号量获得对资源访问的许可。可用资源大于0,线程可以对资源进行访问,此时计数器减1。当计数器为0时,不可访问资源,线程进入等待。当资源释放时,线程结束等待,对资源进行访问。信号量限制并发访问的数量,互斥量实现对具体数据的同步。

release函数将技术值加1这是个原子操作,acquire将计数值减1,如果当前为大于1将减1,如果为0,该函数阻塞。信号量常用于生产者和消费者场景以及资源池应用场景。

下面通过一个停车场模拟信号量的使用

#include<array>
#include<vector>
#include<thread>
#include<iostream>
#include<mutex>
#include<algorithm>
#include<sstream>
#include<iomanip>
#include<semaphore>
#include<random>
#include<syncstream>
using namespace std;

template<std::size_t N=10>

class CarPark
{
public:
	CarPark() :sem(N) {};
	int enter() {//代表一辆车进入停车场
		osyncstream(cout) << "[" << this_thread::get_id() << "]准备进入停车场\n";
		sem.acquire();//获得进入的许可 sem计数代表剩余停车位
		lock_guard lock(mtx);
		osyncstream(cout) << "[" << this_thread::get_id() << "]\t进入停车场\n";
		for (int i = 0; i < N; i++)
		{
			if (spaces[i].empty())
			{
				stringstream ss;
				ss<< this_thread::get_id();//相当于车牌号
				spaces[i] = ss.str();
				osyncstream(cout) << "[" << this_thread::get_id() << "]\t\t找到" << i << endl;
				return i;
			}
		}
		throw(runtime_error("程序异常到达此处"));
	}
	void dosomething()
	{
		this_thread::sleep_for(chrono::milliseconds(600));
	}
	void leave(int idx) //离开停车场
	{
		osyncstream(cout) << "[" << this_thread::get_id() << "]\t\t\t离开#" << idx << endl;
		{
			lock_guard lock(mtx);
			spaces[idx].clear();//空出的停车位
		}
		sem.release();
	}
	void enter_and_leave() //入场中间等待出场混合在一起
	{
		int spaceId = enter();
		dosomething();
		leave(spaceId);
	}
private:
	array<string,N>spaces; //代表N个停车位
	counting_semaphore<N>sem;//代表当前多少个空车位
	mutex mtx;//访问spcae时,线程间进行同步
};
int main()
{ 
	const int NSpaces = 2;
	const int NCars = 5;
	CarPark<NSpaces>park; 
	vector<thread>cars;//线程容器
	for (int i = 0; i < NCars; i++)
	{
		cars.emplace_back([&park]() 
		{
			park.enter_and_leave();
		});
	}
	for (auto& t : cars)
	{
		t.join();
	}
	return 0;
}

运行结果 

接下来往一个循环buf读写数据

相关文章:

  • react基础语法视图层类组件
  • 计算机毕业设计:驾校综合信息系统
  • 基于SpringBoot实现旅游酒店平台功能八
  • MCU与SFU:实时音视频通信架构的对比
  • 使用STM32CubeMX配置定时器中断实现LED每秒闪烁一次(STM32G070CBT6)
  • 【Yonghong 企业日常问题07 】 东方通TongWeb替代Tomcat的实战指南!
  • ubuntu中用docker下载opengauss
  • 利用 ECB 加密 json并压测接口,输出测试报告
  • 计算机网络基础:PKI(公钥基础设施)
  • vue el-select 省市区三级联动 vue + element-ui使用第三方插件实现省市区三级联动
  • BambuStudio学习笔记:MinAreaBoundigBox
  • 远程手机遥控开关原理及应用
  • 如何安全处置旧设备?
  • Java 无 GUI 浏览器:HtmlUnit 入门及实战 [特殊字符]
  • Linux笔记
  • 消防设施操作员考试:理性分析与科学备考​
  • jQuery补充
  • Python----数据可视化(Seaborn合集:介绍,应用,绘图,使用FacetGrid绘图)
  • DiskGenius 硬盘管理工具下载+D盘空间扩容给C盘教程
  • Manus 演示案例:自动完成小说编写并生成最终 PDF 文档
  • 网站调用网页怎么做/北京建站工作室
  • 苏州网站搜索优化/seo搜索引擎优化兴盛优选
  • 怎么让学生在网站上做问卷调查/北京百度关键词排名
  • 做好的网站启用/短视频培训学校
  • html5的网站设计/西安seo排名扣费
  • 软件开发外包公司靠谱吗/肇庆seo按天计费