Linux--多线程(二)
文章目录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)]

相关新闻

英伟达Vera CPU加速EDA:芯片设计算力瓶颈的专用架构突破

英伟达Vera CPU加速EDA:芯片设计算力瓶颈的专用架构突破

如果你是一名芯片设计工程师,最近可能已经感受到了行业的变化:传统的 EDA 工具运行时间越来越长,复杂的芯片设计项目需要数周甚至数月才能完成一次完整流程。就在这样的背景下,英伟达宣布了一个重要消息——他们正在使用自研的 Ve…

2026/7/30 2:49:44 阅读更多 →
机械设计项目|毕业设计|答疑辅导|瓜果切丝切片机的结构设计

机械设计项目|毕业设计|答疑辅导|瓜果切丝切片机的结构设计

标题:瓜果切丝切片机的结构设计 一、文档介绍 摘要:随着食品工业的快速发展,对高效、稳定的瓜果切丝切片机需求日益增长。本文聚焦于瓜果切丝切片机的结构设计与性能优化研究,旨在解决现有设备在切割效率、质量稳定性及能耗等方…

2026/7/30 2:49:44 阅读更多 →
Android USB接口读写速度测试:从原理到实践的性能评估指南

Android USB接口读写速度测试:从原理到实践的性能评估指南

1. 项目概述:为什么要在Android上测试USB接口速度?在移动开发或者硬件评测领域,我们经常会遇到一个看似简单却至关重要的需求:评估一个Android设备通过USB接口传输数据的真实性能。这个需求背后,往往关联着几个非常实际…

2026/7/30 2:49:44 阅读更多 →

最新新闻

CAN FD与经典CAN 2.0帧结构深度对比与工程实践指南

CAN FD与经典CAN 2.0帧结构深度对比与工程实践指南

1. 项目概述:为什么我们需要对比CAN FD与经典CAN 2.0?如果你在汽车电子、工业控制或者机器人领域工作,那么“CAN总线”这个词对你来说就像空气一样熟悉。但最近几年,一个升级版的“CAN FD”开始越来越多地出现在项目需求、芯片选型…

2026/7/30 2:54:46 阅读更多 →
终极指南:VSCode Mermaid Preview高效图表可视化解决方案

终极指南:VSCode Mermaid Preview高效图表可视化解决方案

终极指南:VSCode Mermaid Preview高效图表可视化解决方案 【免费下载链接】vscode-mermaid-preview Previews Mermaid diagrams 项目地址: https://gitcode.com/gh_mirrors/vs/vscode-mermaid-preview 在当今技术文档编写和系统设计过程中,图表可…

2026/7/30 2:54:45 阅读更多 →
Palworld存档转换工具终极指南:轻松备份、修复和管理你的游戏进度

Palworld存档转换工具终极指南:轻松备份、修复和管理你的游戏进度

Palworld存档转换工具终极指南:轻松备份、修复和管理你的游戏进度 【免费下载链接】palworld-save-tools Tools for converting Palworld .sav files to JSON and back 项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools Palworld存档转换工…

2026/7/30 2:54:45 阅读更多 →
League Akari终极指南:英雄联盟智能助手全功能解析

League Akari终极指南:英雄联盟智能助手全功能解析

League Akari终极指南:英雄联盟智能助手全功能解析 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League Akari是一款基于官方LCU…

2026/7/30 2:54:45 阅读更多 →
Waves Ultimate 17一键安装完整版安装教程Waves 17最新版VR/R2R下载专用混音插件Win/Mac系统Waves 17/16/15/14视频安装教程一键安装

Waves Ultimate 17一键安装完整版安装教程Waves 17最新版VR/R2R下载专用混音插件Win/Mac系统Waves 17/16/15/14视频安装教程一键安装

Win/Mac Waves 17 / Waves16 最新中文完整版​ Waves 17 下载链接:Win系统 https://www.dygdu.com/16997.htmlMac 系统 https://www.dygdu.com/17000.html“Waves 17”通常指的是Waves Audio(全球知名音频插件开发商)推出的第16代音频插件套装…

2026/7/30 2:54:45 阅读更多 →
Android Camera2 API数码变焦实现:从SCALER_CROP_REGION到平滑缩放

Android Camera2 API数码变焦实现:从SCALER_CROP_REGION到平滑缩放

1. 从Camera1到Camera2:为什么数码变焦的实现方式变了?如果你是从Camera1 API时代过来的Android开发者,第一次接触Camera2 API时,可能会觉得有点懵。在Camera1里,控制相机预览缩放,我们通常直接操作Camera.…

2026/7/30 2:53:45 阅读更多 →

日新闻

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/30 0:00:13 阅读更多 →
如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾经在浏览…

2026/7/30 0:00:13 阅读更多 →
“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

更多请点击: https://intelliparadigm.com 第一章:AI 教师备课辅助 AI 教师备课辅助系统正逐步成为教育数字化转型的核心支撑工具,它并非替代教师,而是通过语义理解、知识图谱与多模态生成能力,将教师从重复性劳动中解…

2026/7/30 0:00:13 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/29 22:18:20 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/29 15:00:03 阅读更多 →

月新闻