线程同步——信号量
文章目录一、信号量介绍1.1 什么是信号量1.2 信号量的原子性1.3 信号量的使用二、C语言使用2.1 函数接口2.2 信号量代码三、C20使用3.1 函数接口3.2 样例线程间同步四、C11模拟信号量一、信号量介绍1.1 什么是信号量信号量是一种特殊的变量是操作系统层面的可以被增加或减少。信号量用于保护一段资源使其每次只能被有限的线程访问到。1.2 信号量的原子性对信号量的访问被保证是原子操作不需要加锁。如果一个程序中有多个线程试图改变一个信号量的值系统保证所有的操作都将依次进行。1.3 信号量的使用信号量通常和互斥锁配合使用互斥锁用于保护共享资源防止多个线程同时访问同一资源导致的竞争问题。而信号量则用于控制对共享资源的并发访问数量以此实现某些同步机制二、C语言使用2.1 函数接口功能 初始化信号量 返回值失败返回-1成功返回0入参 pshared:为真表示为多个进程间共享为0表示是当前进程的局部信号量 value:sem的初始值信号量的大小intsem_init(sem_t*psem,intpshared,unsignedintvalue);功能 获取信号量 返回值失败返回-1成功返回0入参intsem_wait(sem_t*sem);功能 释放信号量 返回值失败返回-1成功返回0入参intsem_post(sem_t*sem);功能 销毁信号量 返回值失败返回-1成功返回0入参intsem_destory(sem_t*sem);如果不销毁信号量则线程退出时可能会产生问题如果你的程序创建了大量的信号量而没有及时销毁可能会将操作系统的资源耗尽。2.2 信号量代码#includestdio.h#includeunistd.h#includestdlib.h#includepthread.h#includesemaphore.hsem_t semDownload;voidfunc(void*arg){sem_wait(semDownload);unsignedint*taskType(unsignedint*)arg;printf( Downloading taskType %d \n,*taskType);sleep(*taskType*2);printf( Finished taskType %d \n,*taskType);sem_post(semDownload);}intmain(){if(sem_init(semDownload,0,2)-1){printf(sem_init error\n);return0;}unsignedinttaskTypeId;pthread_t a_thread,b_thread,c_thread;while(scanf(%d,taskTypeId)!EOF){unsignedintpara1,para2,para3;switch(taskTypeId){case1:para1taskTypeId;pthread_create(a_thread,NULL,(void*)func,(void*)para1);break;case2:para2taskTypeId;pthread_create(b_thread,NULL,(void*)func,(void*)para2);break;case3:para3taskTypeId;pthread_create(c_thread,NULL,(void*)func,(void*)para3);break;default:printf(!!! error taskTypeId %d !!!\n,taskTypeId);break;}}sem_destroy(semDownload);return0;}三、C20使用C20 标准引入了std::counting_semaphore和std::binary_semaphore类分别用于实现计数信号量和二值信号量的功能。3.1 函数接口//计数信号量std::counting_semaphoresize_t max_numobj(size_t init_num);obj.acquire();obj.release();//二值信号量std::binary_semaphoreobj(size_t init_num);这些信号量会在声明周期结束后自动销毁无需显示调用3.2 样例线程间同步#includeiostream#includethread#includesemaphore// 初始许可为 0意味着 acquire 会立即阻塞直到有人 releasestd::counting_semaphore1ready_signal(0);voidproducer(){std::coutProducer: Preparing data...\n;std::this_thread::sleep_for(std::chrono::seconds(2));// 模拟准备数据std::coutProducer: Data ready! Signaling consumer.\n;// 释放许可唤醒等待的消费者ready_signal.release();}voidconsumer(){std::coutConsumer: Waiting for data...\n;// 阻塞等待直到 producer 调用 releaseready_signal.acquire();std::coutConsumer: Received signal. Processing data.\n;}intmain(){std::threadt_prod(producer);std::threadt_cons(consumer);t_prod.join();t_cons.join();return0;}四、C11模拟信号量使用互斥锁和条件变量模拟

相关新闻

VASP用于进行自洽场(SCF)计算,INCAR文件配置

VASP用于进行自洽场(SCF)计算,INCAR文件配置

VASP用于进行标准的自洽场(SCF)计算,INCAR文件配置如下: INCAR文件 # INCAR 自洽场计算# 初始化选项 ISTART = 0 # 从头开始计算 ICHARG = 1 # 从POTCAR初始化电荷密度# 电子占据状态展宽 ISMEAR = 0 # 费米-狄拉克分布 SIGMA = 0.05 # 展宽参数 (eV)# 平面波截…

2026/7/23 18:33:35 阅读更多 →
万拓营销 AI-GEO 优化服务全链路实测与价值评估大纲

万拓营销 AI-GEO 优化服务全链路实测与价值评估大纲

在珠三角的制造业圈子里,最近大家聊得最多的不再是单纯的 SEO 排名或者信息流广告的出价,而是“为什么我的产品在 AI 搜索里搜不到”。很多老板发现,传统的关键词优化在大模型时代似乎失灵了:客户对着 AI 助手问“深圳哪家工厂做精…

2026/7/23 18:32:35 阅读更多 →
深入解析N2HET定时器:架构、多分辨率与高精度PWM实战

深入解析N2HET定时器:架构、多分辨率与高精度PWM实战

1. 项目概述:为什么需要N2HET这样的“定时器大脑”?在嵌入式开发,尤其是汽车电子和工业自动化领域,我们常常需要处理一些让CPU“头疼”的任务:比如,一个电机需要以0.1%的精度输出PWM波,同时还要…

2026/7/23 18:32:35 阅读更多 →

最新新闻

做照明工程前一定要搞懂的三个实际问题

做照明工程前一定要搞懂的三个实际问题

很多业主在启动照明相关项目前,总会被几个共性问题卡住:不知道项目周期怎么排,预算摸不准,改造成本能不能赚回来也没谱。这些问题没有统一答案,得结合项目实际情况拆解开来看。很多人问泛光照明工程从设计到施工要多久…

2026/7/23 18:50:41 阅读更多 →
城市照明项目里的那些实用参考标准

城市照明项目里的那些实用参考标准

不少项目方在启动照明相关工程时,总会遇到几个绕不开的实际问题:泛光照明工程从设计到施工要多久,商业文旅街区做灯光改造一平方多少钱,办公楼照明节能改造多长时间能回本。这些问题并没有统一的标准答案,但从已落地的…

2026/7/23 18:50:41 阅读更多 →
融资融券的交易机制、操作条件与风险是什么?为什么两融现在利率最低?

融资融券的交易机制、操作条件与风险是什么?为什么两融现在利率最低?

大家好,我是ArthurGoo,在写这篇文章前,先说句得罪人的话:90%的散户根本就不该碰两融。很多人以为,辛辛苦苦往账户里倒腾资金,熬过了那20天日均50万的资产考核、顺利开通了权限,就是拿到了通往财…

2026/7/23 18:50:41 阅读更多 →
严格路由 vs 松散路由

严格路由 vs 松散路由

Kamailio 里的“严格路由”和“松散路由”本质上是 SIP Route/Record-Route 机制的两种模式,分别来自较老的 RFC 2543 和较新的 RFC 3261。现在实际生产中几乎都使用松散路由。1. 核心区别对比项严格路由 Strict Routing松散路由 Loose Routing标准来源旧 RFC 2543R…

2026/7/23 18:50:41 阅读更多 →
Vibe Coding到Agentic Engineering:AI编程范式演进与实战指南

Vibe Coding到Agentic Engineering:AI编程范式演进与实战指南

Vibe Coding到Agentic Engineering:AI编程范式演进与实战指南 2025年2月,OpenAI联合创始人Andrej Karpathy首次提出"Vibe Coding"(氛围编程)概念,同年入选柯林斯词典年度热词。然而仅仅一年后,20…

2026/7/23 18:50:41 阅读更多 →
财务场景 RPA 替代技术:发票审核与对账自动化 Agent 实现方案深度解析与主流厂商测评

财务场景 RPA 替代技术:发票审核与对账自动化 Agent 实现方案深度解析与主流厂商测评

在企业数字化转型的深水区,财务部门正经历从“规则驱动”向“智能驱动”的技术范式重构。传统的RPA(机器人流程自动化)虽然解决了跨系统搬运数据的重复性工作,但在面对非结构化发票识别、动态对账逻辑判断以及长链路业务闭环时&am…

2026/7/23 18:49:41 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 17:49:47 阅读更多 →

月新闻