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

Linux——线程同步

目录

同步

条件变量

条件变量的创建

条件变量的销毁

条件变量的等待

条件变量的唤醒

解决饥饿问题

​编辑

生产者消费者模型

介绍


只有认知的突破💫才能带来真正的成长💫编程技术的学习💫没有捷径💫一起加油💫

🍁感谢各位的观看🍁欢迎大家留言🍁咱们一起加油🍁努力成为更好的自己🍁

同步

同步:在保证数据安全的前提下,让线程能够按照某种特定的顺序访问临界资源,从而有效避免饥饿问题,叫做同步。

条件变量

条件变量,就是创建一个进程等待队列,处理完资源后就入队列,然后头部进程先执行,依次公平的竞争和处理资源,就向排队一样。

条件变量的创建
  • 创建静态全局条件变量

代码:pthread_cond_t cond = PTHREAD_COND_INITIALIZER

  • 创建动态局部条件变量,要使用函数初始化。

函数:int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t *restrict attr);使用该函数进行条件变量的初始化。

条件变量的销毁

函数:int pthread_cond_destroy(pthread_cond_t *cond)

条件变量的等待

函数:int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex)使用它,使线程在条件变量的等待队列中,进行等待。进入等待队列的线程,会把申请到的锁给释放掉。当被唤醒后,还会归还锁。

参数:

  • pthread_cond_t *restrict cond:在指定的条件变量等待。

  • pthread_mutex_t *restrict mutex:释放自己申请到的锁。

条件变量的唤醒
  • 函数:int pthread_cond_broadcast(pthread_cond_t *cond)。广播唤醒所有的进程处理资源。

  • 函数:int pthread_cond_signal(pthread_cond_t *cond)。唤醒至少一个线程处理资源。

解决饥饿问题

互斥锁+条件变量=解决饥饿问题。如下所示的代码。

// 操作共享变量会有问题的售票系统代码 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <pthread.h> int ticket = 10; //总票数 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; //创建锁 pthread_cond_t cond=PTHREAD_COND_INITIALIZER; //创建条件变量 void *route(void *arg) { char *id = (char *)arg; while (ticket>0) { pthread_mutex_lock(&mutex); //加锁 pthread_cond_wait(&cond,&mutex);//等待队列等待 if(ticket<=0) break; printf("%s sells ticket:%d\n", id, ticket); ticket--; pthread_mutex_unlock(&mutex);//释放锁 } //避免抢到票为0,锁未释放 pthread_mutex_unlock(&mutex);//释放锁 return (void*)0; } int main(void) { pthread_t t1, t2, t3, t4; //创建4个线程 pthread_create(&t1, NULL, route, (void *)"thread 1"); pthread_create(&t2, NULL, route, (void *)"thread 2"); pthread_create(&t3, NULL, route, (void *)"thread 3"); pthread_create(&t4, NULL, route, (void *)"thread 4"); sleep(3); while(1) { pthread_cond_signal(&cond); //每隔1秒唤醒一个线程 sleep(1); } pthread_join(t1, NULL); pthread_join(t2, NULL); pthread_join(t3, NULL); pthread_join(t4, NULL); //等待完所有的线程后,进行锁的销毁 pthread_mutex_destroy(&mutex); pthread_cond_destroy(&cond);//释放条件变量 return 0; }

生产者消费者模型

作用:解决生产数据消费数据的速度不匹配问题,同时实现生产、消费逻辑的解耦,提升系统并发处理能力和资源利用率。

介绍

模型由 3 个核心部分组成,职责清晰、各司其职:

  • 生产者:负责创建 / 生成数据的线程 / 进程(比如采集日志、接收网络请求、解析文件等),生产完成后将数据交付至缓冲区,不直接与消费者交互。

  • 消费者:负责处理 / 消费数据的线程 / 进程(比如分析日志、处理请求、计算数据等),仅从缓冲区获取数据,不直接与生产者交互。

  • 缓冲区:连接生产者和消费者的中间容器(核心 “桥梁”),本质是一块内存区域,常见实现有队列(FIFO,先进先出)、环形缓冲区等,使模型能解耦。缓冲区是共享资源,要加锁保护。

http://www.jsqmd.com/news/439928/

相关文章:

  • 2026 AI 爆发:五大趋势重塑产品构建,错过等一年!
  • if really so important as a tt creator
  • 2026年深圳全屋定制品牌推荐:豪宅场景深度评测,解决品质与设计痛点并附排名 - 品牌推荐
  • LLM的注意力层,竟是长文档检索器?这项突破让RAG效果飙升!
  • NETCORE - IdentityServer4 多节点部署
  • 2026年企业管理咨询公司推荐:深度评价战略适配与组织增效,解决成本与效率核心痛点 - 品牌推荐
  • 2026年深圳全屋定制品牌推荐:高端家居趋势评测,涵盖大宅与精英圈层核心痛点 - 品牌推荐
  • Flutter 三方库 markdown 的鸿蒙化适配指南 - 掌控标准化文本渲染、高性能解析引擎实战、鸿蒙级内容展示专家
  • 5G 浪潮下的自智网络:海量信令数据的存储架构如何进化?
  • [AI智能体与提效-159] - Python语言优势与弱势
  • 2026年深圳全屋定制品牌推荐:高端家居趋势评测,涵盖大宅与改善场景核心痛点 - 品牌推荐
  • (电压击穿试验仪、体积电阻率测试仪、体积电阻率测定仪)供应商怎么选?厂家推荐哪家好? - 品牌推荐大师
  • SEAGULL模块化系统:对话实体智能体技术解析
  • endo-BCN-PEG8-amine,内型-BCN-八聚乙二醇-胺
  • antv3 x6 基本语法-边、节点、图片处理(七)
  • 导师推荐 9个AI论文写作软件:研究生毕业论文+开题报告高效写作工具测评
  • 2026年深圳全屋定制品牌推荐:基于多场景实测评价,针对环保与工期痛点精准指南 - 品牌推荐
  • 2026年全屋定制品牌推荐:居家与办公场景深度评测,解决环保与设计痛点并附排名。 - 品牌推荐
  • Flutter 三方库 shelf_router_generator 的鸿蒙化适配指南 - 注解驱动的 API 架构、自动化路由生成、鸿蒙级微服务开发提效专家
  • WPF 多值绑定(MultiBinding)详解
  • 计算机毕业设计springboot基于Android高校教学楼信息管理系统 基于SpringBoot与Android技术的智慧校园教室资源调度平台设计 采用移动端的高校教学场所智能化预约与管理系统研发
  • Spring Boot入门(快速搭建第一个项目,新手零配置)
  • 赶deadline必备 一键生成论文工具 千笔·专业论文写作工具 VS 学术猹
  • 现在2026年开始学网络安全的真实情况是什么?还好就业吗?
  • 关于wangEdit如何添加标注
  • 计算机毕业设计springboot基于Android的运动助手 基于SpringBoot与Android技术的智能健身管理平台设计与实现 采用移动端的企业员工运动健康追踪系统研发
  • 拼多多商品券后价API接口使用指南
  • 3月科技企业孵化器公司推荐,看看哪些做得好,科技企业孵化器/企业孵化服务/科技政策申报,科技企业孵化器企业口碑推荐榜 - 品牌推荐师
  • hot100 322.零钱兑换
  • 2026年全屋定制品牌推荐:智能家居趋势评测,涵盖日常与高端场景定制痛点 - 品牌推荐