线程同步——信号量
📅 2026/7/23 18:33:50
👁️ 次浏览
文章目录一、信号量介绍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文件配置如下:
INCAR文件
# INCAR 自洽场计算# 初始化选项
ISTART = 0 # 从头开始计算
ICHARG = 1 # 从POTCAR初始化电荷密度# 电子占据状态展宽
ISMEAR = 0 # 费米-狄拉克分布
SIGMA = 0.05 # 展宽参数 (eV)# 平面波截…
📅 2026/7/23 18:33:50
在热力能源系统中,锅炉部件起着关键作用,其中空气预热器等设备对提升锅炉效率、降低能耗至关重要。下面为大家介绍相关领域内不容错过的几家公司。山东博宇重工:专业与服务兼顾山东博宇重工位于泰山脚下,拥有A级锅炉部件资质以及多…
📅 2026/7/23 18:33:50
按人群先给建议
律师整理客户拜访笔录不用再逐字听录音手打,现在主流录音转文字工具都能搞定基础转写,不用花几小时熬文案。我做了大半年AI效率工具长期测试,结合律师做拜访笔录、职场新人整理培训内容的核心需求,整理了2026年5款…
📅 2026/7/23 18:33:50
OpenWRT固件编译实战:从零开始打造你的专属路由器系统
1. 环境准备与基础配置
编译OpenWRT固件前,需要搭建一个稳定的Linux环境。推荐使用Ubuntu 20.04 LTS或更新版本作为基础系统,因为其软件包管理完善且社区支持广泛。以下是基本环境配置步骤: 系统更新与依赖安装: su…
📅 2026/7/23 19:44:24
1. LLM/RAG评估工具链全景解析在构建基于大语言模型(LLM)和检索增强生成(RAG)的AI系统时,评估环节往往成为项目落地的关键瓶颈。传统评估方法存在三大痛点:指标单一(仅关注最终答案准确性)、过程黑箱(无法定位问题环节…
📅 2026/7/23 19:44:24
一、学完本篇你能掌握什么学完本篇你将掌握:5大主流AI模型(GPT-4o、Claude、DeepSeek、通义千问、Kimi)各自的特点和优劣势理解"上下文窗口""温度""工具调用"等核心参数的实际意义用同一个Prompt在5个模型上做对比测试,直…
📅 2026/7/23 19:44:24
1. 项目概述:本科生如何选择专业降AI率工具去年帮表弟改论文时,我亲眼见证了他用某款AI工具生成的初稿被导师当场识破的尴尬场景。那台笔记本电脑屏幕上闪烁的红色批注"疑似AI生成"几个大字,至今让我记忆犹新。这件事促使我系统测试…
📅 2026/7/23 19:44:24
1. OpenClaw 持久记忆机制解析OpenClaw 的记忆系统采用了一种独特的"三层存储架构",这与传统AI模型的短期记忆形成鲜明对比。传统模型通常依赖单一上下文窗口,而OpenClaw将记忆分为:长期记忆层(MEMORY.md)&a…
📅 2026/7/23 19:44:24
本文关键词:geo synthesizer下载说实话,我最近真是被那些所谓的“免费资源”给气笑了。满大街都是喊着“最新破解版”的链接。点进去全是广告,下完全是病毒。这种糟心事,谁遇到谁头疼。今天我就掏心窝子跟大家聊聊,到底怎么安全地搞到 geo synthesizer下载 这个工具。先说…
📅 2026/7/23 19:43:13
更多请点击:
https://intelliparadigm.com
第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…
📅 2026/7/23 0:00:26
最近好多同行在群里问 geo s1230 到底值不值得买。说实话,这机器在二手市场挺火。但水很深,新手很容易踩雷。我干了十年设备维护,见过太多冤大头。今天不扯虚的,直接上干货。先说价格,心里得有底。目前成色不错的二手货,大概在一万二到一万五之间。如果低于八千,别犹豫,…
📅 2026/7/23 0:01:16
更多请点击:
https://codechina.net
第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现࿱…
📅 2026/7/23 0:01:26
1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…
📅 2026/7/23 1:06:38
1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…
📅 2026/7/23 1:06:38
更多请点击:
https://intelliparadigm.com
第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…
📅 2026/7/23 1:06:38
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/23 7:06:56
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/23 17:07:28
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/23 5:06:50