Linux--多线程(二)
📅 2026/7/30 2:49:40
👁️ 次浏览
文章目录Linux线程同步条件变量同步概念与竞态条件条件变量函数初始化销毁等待条件满足唤醒等待简单案例条件变量使用规范生产者消费者模型基于BlockingQueue的生产者消费者模型Linux线程同步条件变量当一个线程互斥地访问某个变量时它可能发现在其他线程改变状态之前它什么也做不了例如一个线程访问队列时发现队列为空它只能等待直到其他线程将一个节点添加到队列中。这种情况需要用到条件变量同步概念与竞态条件同步在保证数据安全的前提下让线程能够按照某种特定的顺序访问临界资源从而有效避免饥饿问题叫做同步竞态条件因为时序问题而导致程序异常我们称之为竞态条件。条件变量函数初始化intpthread_cond_init(pthread_cond_t*restrict cond,constpthread_condattr_t*restrict attr);参数 cond:要初始化的条件变量 attr:NULL销毁intpthread_cond_destroy(pthread_cond_t*cond);等待条件满足intpthread_cond_wait(pthread_cond_t*restrict cond,pthread_mutex_t*restrict mutex);参数 cond要在这个条件变量上等待 mutex互斥量唤醒等待// 唤醒在条件变量下等待的所有线程intpthread_cond_broadcast(pthread_cond_t*cond);// 唤醒在条件变量下等待队列的第一个线程intpthread_cond_signal(pthread_cond_t*cond);简单案例// 线程等待#includestdio.h#includestdlib.h#includestring.h#includeunistd.h#includepthread.h// 定义条件变量与互斥量pthread_cond_tcond;pthread_mutex_tmutex;// 定义线程的回调函数void*handle1(void*arg){while(1){// 等待条件满足pthread_cond_wait(cond,mutex);printf(活动\n);}}void*handle2(void*arg){while(1){// 唤醒等待pthread_cond_signal(cond);sleep(1);}}intmain(){pthread_tt1,t2;// 初始化条件变量pthread_cond_init(cond,NULL);// 初始化互斥量pthread_mutex_init(mutex,NULL);pthread_create(t1,NULL,handle1,NULL);pthread_create(t2,NULL,handle2,NULL);pthread_join(t1,NULL);pthread_join(t2,NULL);pthread_cond_destroy(cond);pthread_mutex_destroy(mutex);return0;}程序执行的结果就是每个1秒就打印一次那么可能有同学会问为什么pthread_cond_wait需要互斥量呢条件等待是线程间同步的一种手段如果只有一个线程条件不满足一直等下去都不会满足所以必须要有一个线程通过某些操作改变共享变量使原先不满足的条件变得满足并且友好的通知等待在条件变量上的线程条件不会无缘无故的突然变得满足了必然会牵扯到共享数据的变化。所以一定要用互斥锁来保护。没有互斥锁就无法安全的获取和修改共享数据。// 错误的设计pthread_mutex_lock(mutex);while(condition_is_false){pthread_mutex_unlock(mutex);// 解锁之后等待之前条件可能已经满足信号已经发出但是该信号可能被错过pthread_cond_wait(cond);pthread_mutex_lock(mutex);}pthread_mutex_unlock(mutex);由于解锁和等待不是原子操作。调用解锁之后pthread_cond_wait之前如果已经有其他线程获取到互斥量并且条件满足发送了信号那么pthread_cond_wait将错过这个信号可能会导致线程永远阻塞在这个pthread_cond_wait。所以解锁和等待必须是一个原子操作。int pthread_cond_wait(pthread_cond_t* cond, pthread_mutex_t* mutex)进入该函数后会去看条件量等于0不等于就把互斥量变成1直到cond_wait返回把条件变量改成1把互斥量恢复成原样条件变量使用规范等待条件代码pthread_mutex_lock(mutex);while(条件为假){pthread_cond_wait(cond,mutex);}修改条件pthread_mutex_unlock(mutex);条件发送信号代码pthread_mutex_lock(mutex);// 设置条件为真pthread_cond_signal(cond);pthread_mutex_unlock(mutex);生产者消费者模型生产者消费者模式就是通过一个容器来解决生产者和消费之的强耦合问题。生产者和消费者彼此之间不直接通讯而通过阻塞队列来进行通讯所以生产者产完数据之后就不用等待消费者处理直接扔给阻塞队列消费者不找生产者要数据二十直接从阻塞队列里取阻塞队列就相当于一个缓冲区平衡了生产者和消费者的处理能力。这个阻塞队列就是用来给生产者和消费者解耦的。基于BlockingQueue的生产者消费者模型在多线程编程中**阻塞队列(Blocking Queue)**是一种常用于实现生产者和消费者模型的数据结构。其与普通的队列区别在于当队列为空时从队列获取元素的操作将会被阻塞直到队列中被放入了元素当队列满时往队列里放元素的操作也会被阻塞直到有元素被从队列中取出以上操作都是基于不同的线程来说的线程在对阻塞队列进程操作时会被阻塞通的队列区别在于当队列为空时从队列获取元素的操作将会被阻塞直到队列中被放入了元素当队列满时往队列里放元素的操作也会被阻塞直到有元素被从队列中取出以上操作都是基于不同的线程来说的线程在对阻塞队列进程操作时会被阻塞[外链图片转存中…(img-cx8WHt0e-1785332983262)]
如果你是一名芯片设计工程师,最近可能已经感受到了行业的变化:传统的 EDA 工具运行时间越来越长,复杂的芯片设计项目需要数周甚至数月才能完成一次完整流程。就在这样的背景下,英伟达宣布了一个重要消息——他们正在使用自研的 Ve…
📅 2026/7/30 2:49:40
标题:瓜果切丝切片机的结构设计
一、文档介绍
摘要:随着食品工业的快速发展,对高效、稳定的瓜果切丝切片机需求日益增长。本文聚焦于瓜果切丝切片机的结构设计与性能优化研究,旨在解决现有设备在切割效率、质量稳定性及能耗等方…
📅 2026/7/30 2:49:39
1. 项目概述:为什么要在Android上测试USB接口速度?在移动开发或者硬件评测领域,我们经常会遇到一个看似简单却至关重要的需求:评估一个Android设备通过USB接口传输数据的真实性能。这个需求背后,往往关联着几个非常实际…
📅 2026/7/30 2:49:39
准备出国留学、海外求职、境外移民的人群,大多需要办理成绩单公证。不少申请人初次接触这项业务,常常卡在材料筹备、办理渠道、翻译要求、后续认证等环节,反复补件、来回奔波,甚至临近申请截止日期才发现材料不合规。本文完整梳理…
📅 2026/7/30 3:40:30
一、营业执照公证基础科普:营业执照公证是什么1.1 营业执照公证通俗概念解读很多人第一次听到营业执照公证,会简单理解成 “复印营业执照盖章”,实际上二者存在明显区别。 营业执照,是市场监管部门发放给企业、个体工商户…
📅 2026/7/30 3:40:30
办理海外留学、跨国婚恋、境外务工或是海外置业手续时,无婚姻登记记录公证(俗称未婚公证) 是必不可少的涉外文书。过去多数人需要往返户籍地民政大厅与公证处两头奔波,耗费大量时间精力;如今线上政务公证渠道全面普及&…
📅 2026/7/30 3:40:30
在日常Python开发中,字典和字符串无疑是使用频率最高的两种数据类型。无论是处理JSON数据、配置文件解析,还是文本清洗和格式化输出,都离不开它们的灵活运用。然而很多初学者在使用时会遇到键值对操作不熟练、字符串方法记不住、两者转换容易…
📅 2026/7/30 3:40:30
如何一键打造专业级虚拟摄像头?obs-virtual-cam完整配置与实战指南 【免费下载链接】obs-virtual-cam 项目地址: https://gitcode.com/gh_mirrors/obsv/obs-virtual-cam
obs-virtual-cam是一款强大的OBS虚拟摄像头插件,它能将OBS Studio的视频输…
📅 2026/7/30 3:40:30
1. 项目概述:从单域名到多域名的安全升级在构建现代Web服务时,HTTPS早已是标配。但你是否遇到过这样的场景:一个应用需要同时通过www.example.com和example.com提供服务,或者一个API服务需要同时支持api.service.com和service.int…
📅 2026/7/30 3:39:29
本文关键词:geo2是共价化合物哎,说实话,每次看到化学题里那些弯弯绕绕的电子式,我就头大。特别是遇到那种非要让你判断是离子还是共价的,心里就发毛。今天咱不整那些虚头巴脑的定义,就聊聊二氧化硅,也就是大家常说的硅石、石英,很多人会误写成geo2,虽然化学式不对,但…
📅 2026/7/30 0:00:24
B4557 [GESP202606 四级] 扫雷 https://www.luogu.com.cn/problem/B4557 中国计算机学会(CCF)2026年6月C四级讲解——扫雷 https://www.bilibili.com/video/BV1MCMg6AEXR/ B4557 [GESP202606 四级] 扫雷 https://www.bilibili.com/video/BV1ZKTj6ZEVh/ 2…
📅 2026/7/30 0:00:26
Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer
您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…
📅 2026/7/30 0:00:26
更多请点击:
https://codechina.net
第一章:AI帮助理解数学概念 人工智能正以前所未有的方式重塑数学学习的路径。通过自然语言处理与符号计算的深度融合,AI不仅能解析抽象定义,还能将定理、证明和几何直觉转化为可交互、可验证的…
📅 2026/7/30 1:16:07
1. 项目背景与核心价值去年参与的一个短剧项目让我深刻体会到传统创作流程的痛点:编剧团队花了三周打磨剧本,角色设计反复修改了七版,最后成片时又因为演员档期问题不得不临时调整分镜。这种低效的创作模式在快节奏的内容行业越来越难以为继。…
📅 2026/7/30 1:16:07
remix-i18next TypeScript类型安全实践:确保翻译键与类型定义同步 【免费下载链接】remix-i18next The easiest way to translate your React Router framework mode apps 项目地址: https://gitcode.com/gh_mirrors/re/remix-i18next
在开发多语言应用时&am…
📅 2026/7/30 1:16:07
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/29 7:15:11
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/29 17:15:46
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/29 5:15:05