首页/新闻资讯/正文详情

第61天 线程的互斥和同步

发布时间:2026/11/7 8:51:16 来源:云帆数科 栏目:资讯中心
第61天 线程的互斥和同步
一.互斥锁互斥锁(Mutex,即Mutual Exclusion Lock)是并发编程中用于保护 “共享资源”的同步工具本质是一把 “独占钥匙”1.当多个线程同时读写共享资源时会出现 “竞态条件”导致数据错误2.互斥锁能强制线程 “排队访问” 资源避免竞争核心作用保证 “同一时刻只有一个线程能持有锁并访问共享资源”实现 “互斥访问”#include pthread.h1.pthread_mutex_init函数int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);动态初始化互斥锁mutex 指定要进行初始化的互斥锁变量attr 设置互斥锁的属性若传NULL使用系统默认属性pthread_mutex_t PTHREAD_MUTEX_INITIALIZER; --- 静态初始化互斥锁成功返回0 失败返回非0错误码2.pthread_mutex_lock函数int pthread_mutex_lock(pthread_mutex_t *mutex);用于获取互斥锁当互斥锁已被其他线程获取时调用该函数的线程会被阻塞直到互斥锁可用并成功获取mutex 互斥锁成功返回0 失败返回非0错误码3.pthread_mutex_trylock函数int pthread_mutex_trylock(pthread_mutex_t *mutex);用于获取互斥锁当互斥锁已被其他线程获取时调用该函数的线程不会被阻塞而是立即返回错误mutex 互斥锁成功返回0 失败返回非0错误码4.pthread_mutex_unlock函数int pthread_mutex_unlock(pthread_mutex_t *mutex);解锁一般使用时只有加锁的线程可以解锁mutex 互斥锁返回值 成功返回0 失败返回非0错误码5.pthread_mutex_destroy函数int pthread_mutex_destroy(pthread_mutex_t *mutex);销毁互斥锁mutex 互斥锁返回值 成功返回0 失败返回非0错误码二.条件变量cond条件变量是并发编程中用于实现线程间“等待-通知”机制的同步工具可让线程在某个条件不满足时挂起 待条件满足后被唤醒1.仅用互斥锁能保证共享资源访问的互斥性但无法解决 “线程需等待特定条件成立才能继续执行” 的 场景(比如生产者 - 消费者模型中消费者需等待生产者生产出数据才能消费)2.条件变量可结合互斥锁让线程在条件不满足时主动释放锁并等待条件满足时被唤醒以重新获取锁继续执行灵活应对依赖条件的同步需求核心作用实现线程间的 “条件等待与通知”使线程能在特定条件下协作避免线程忙等情况消耗 CPU 资源提升并发效率1.pthread_cond_init函数int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t *restrict attr);动态初始化条件变量cond 用于指定要初始化的条件变量attr 设置条件变量的属性若为NULL则使用系统默认属性pthread_cond_t cond PTHREAD_COND_INITIALIZER; --- 静态初始化条件变量成功返回0 失败返回非0错误码2.pthread_cond_signal函数int pthread_cond_signal(pthread_cond_t *cond);唤醒至少一个等待在指定条件变量(cond)上的线程cond 指定要操作的条件变量成功返回0 失败返回非0错误码3.pthread_cond_broadcast函数int pthread_cond_broadcast(pthread_cond_t *cond);唤醒所有等待在指定条件变量(cond)上的线程cond 指定要操作的条件变量成功返回0 失败返回非0错误码4.pthread_cond_wait函数int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex);线程阻塞在条件变量cond上等待被唤醒同时该函数会自动释放传入的互斥锁mutex当线程被唤醒时又会自动重新获取该互斥锁保证了线程在等待条件过程中互斥锁的正确管道避免死锁等问题cond 用于指定线程等待的条件变量mutex 与条件变量配合使用保证线程在等待条件时的互斥成功返回0 失败返回非0错误码5.pthread_cond_destroy函数int pthread_cond_destroy(pthread_cond_t *cond);销毁条件变量相关的资源cond 要销毁的条件变量成功返回0 失败返回非0错误码三.无名信号量无名信号量是一种用于线程同步或进程同步的工具通过维护一个计数值来控制对共享资源的访问可限制同时访问资源的线程或进程数量1. 互斥锁只能保证同一时刻一个线程访问资源而有些场景需要允许多个线程同时访问2. 无名信号量的计数值可灵活设置能实现 “多线程有限并发访问” 或 “线程间的计数同步”补充互斥锁在多资源并发场景的不足核心作用通过计数值控制共享资源的并发访问数量支持多线程在一定限制下同时访问资源或实现线程间基于计数的同步协作#include semaphore.h1.sem_init函数int sem_init(sem_t *sem,int pshared,unsigned int value);初始化无名信号量sem 要初始化的信号量pshared:pshared 0信号量用于进程内的线程间同步(多个线程共享进程内存信号量仅在当前进程内有效)pshared ! 0信号量用于进程间同步(需将信号量放在共享内存中被多个进程映射后共同访问)value: 信号量的初始计数表示可用资源的初始数量value 1初始时有 1 个 “资源” 可用可用于实现互斥(一次一个线程/进程获取)value 0初始时没有“资源”可用调用 sem_wait 的线程/进程会阻塞直到sem_post增加计数成功返回0 失败返回-1重置错误码2.sem_wait函数P操作int sem_wait(sem_t *sem);信号量的值减1如果信号量的当前值大于 0减 1 后函数直接返回(表示“获取资源成功”)如果信号量的当前值等于 0sem_wait 会阻塞直到有其他线程/进程调用sem_post函数使得信号量值大于0后 再执行“减 1”并返回sem 无名信号量成功返回0 失败返回-1重置错误码(不会改变信号量的值)3.sem_post函数V操作int sem_post(sem_t *sem);释放信号量(将信号量的值1)sem 用于指定对哪个信号量进行释放操作成功返回0 失败返回-1重置错误码(不会改变信号量的值)4.sem_destroy函数int sem_destroy(sem_t *sem);销毁无名信号量释放该信号量相关的资源sem 指定对哪个信号量进行销毁操作成功返回0 失败返回-1重置错误码sem_getvalue (获取信号量当前值)四.线程的互斥与同步应用场景一.互斥锁1.应用场景特点单一共享资源同一时刻只允许一个线程访问主要用于防止数据竞争和不一致性问题2.优势实现简单易于理解和使用 能有效解决单一资源的互斥访问问题 保障数据的一致性和完整性3.局限性如果线程长时间持有锁可能导致其他线程长时间等待降低系统并发性能若使用不当容易产生死锁问题比如多个线程循环等待对方持有的锁二.条件变量1.应用场景特点线程需要在某个条件满足时才能继续执行配合互斥锁实现线程间的等待-通知机制2.优势避免线程的忙等待有效节省CPU资源 提高程序的运行效率可以实现更灵活的线程同步逻辑满足 复杂的条件等待和协作需求。3.局限性必须与互斥锁配合使用条件的判断和通知的时机需要准确把握否则可能导致线程无法正确唤醒或错过唤醒影响程序的正确性三.无名信号量1.应用场景特点限制对共享资源的并发访问数量 可用于线程或进程的同步和计数控制2.优势可以灵活控制并发访问的资源数量 适用于需要对资源进行定量管理的场景不仅能实现互斥还能进行计数同步 功能比互斥锁更丰富3.局限性信号量的计数管理需要准确设置和维护 容易出现资源过度使用或浪费的情况

相关推荐

pictures_12的相关工作
pictures_12的相关工作

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 6:38:16

企业内部知识库管理软件怎么选?Confluence、Notion、飞书、坚果云四类方案对比
企业内部知识库管理软件怎么选?Confluence、Notion、飞书、坚果云四类方案对比

文章目录一、知识库软件的四种类型二、四种方案逐一分析2.1 Wiki型(Confluence / 语雀)2.2 模块型(Notion)2.3 聊天驱动型(飞书文档 / 钉钉文档)2.4 文件同步型(坚果云 本地编辑器)… · 2026/11/6 6:37:15

局域网文件传输工具盘点:LocalSend、飞秋、AirDrop、坚果云LAN加速怎么选
局域网文件传输工具盘点:LocalSend、飞秋、AirDrop、坚果云LAN加速怎么选

文章目录一、什么时候需要局域网传输二、五种局域网传输方案对比2.1 LocalSend —— 开源跨平台传输工具2.2 飞秋(FeiQ)—— 老牌局域网即时通讯2.3 AirDrop —— 苹果生态专属2.4 Windows共享文件夹 —— 系统自带2.5 坚果云 LAN Sync —— 持续同步的局… · 2026/11/6 6:37:15

上海电工证复证费用2026河南最新政策下怎么应对学历不高怕报不上名
上海电工证复证费用2026河南最新政策下怎么应对学历不高怕报不上名

上海电工证复证费用2026河南最新政策下怎么应对学历不高怕报不上名 你不是一个人,学历不高怕报不上名,这是很多特种作业考生的真实感受。尤其是在2026年河南最新政策下,报考门槛和考试难度都有所提升,很多没有系统学习过电工知识的人,开始担心自… · 2026/11/7 8:50:42

成都德阳低压电工证多少钱?外省证怎么转?
成都德阳低压电工证多少钱?外省证怎么转?

成都德阳低压电工证多少钱?外省证怎么转? 之前考的证在外省能不能转过来?这个问题,很多在成都、德阳的朋友都问过,特别是在工地、工厂做电工的,手里拿着 成都德阳低压电工证… · 2026/11/7 8:50:42

特种工信号工证租赁行业前景与含金量解析:学历不高怕报不上名?其实不难!
特种工信号工证租赁行业前景与含金量解析:学历不高怕报不上名?其实不难!

特种工信号工证租赁行业前景与含金量解析:学历不高怕报不上名?其实不难! 你是不是总听说特种作业证含金量高,但又担心自己学历不高,根本报不上名?别急,今天就从三门峡一位初次报考人员的角度,聊聊特种工信号工证租赁行业到底值不值得考,能不能真正改… · 2026/11/7 8:50:42

工地太忙根本没时间复习考试?内部消息教你大良在哪里考电工证
工地太忙根本没时间复习考试?内部消息教你大良在哪里考电工证

工地太忙根本没时间复习考试?内部消息教你大良在哪里考电工证 工地太忙根本没时间复习考试,你不是一个人。很多在焦作从事公路工程的兄弟都遇到过这个问题,电工证考试成了压在心头的一块石头。尤其是现在, 大良在哪里考电工证… · 2026/11/7 8:50:42

长春市低压电工证怕考不过白交培训费?看看郑州报考避坑指南
长春市低压电工证怕考不过白交培训费?看看郑州报考避坑指南

长春市低压电工证怕考不过白交培训费?看看郑州报考避坑指南 怕考不过白交培训费?别让钱打了水漂!长春市低压电工证是很多从事电气作业人员的“硬门槛”,但很多学员在报考时却因为不了解流程、培训机构鱼龙混杂、考试内容不清晰,导致花了钱还白忙一场。今… · 2026/11/7 8:50:42

考电工证怎么写申请值不值得考
考电工证怎么写申请值不值得考

你拟定的标题 30岁建筑工人考电工证怎么写申请 良心建议别被学历绊住脚 你是不是也这样,看到“考电工证怎么写申请”几个字,心里一紧,想着自己学历不高,连报名都可能被拒?别急,老张在这儿跟你说句实在话, 学历不高怕报不上名… · 2026/11/7 8:49:42

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 10:29:23

澳洲水电工证考试:证书过期了不知道怎么复审延期?电子证书怎么弄?
澳洲水电工证考试:证书过期了不知道怎么复审延期?电子证书怎么弄?

澳洲水电工证考试:证书过期了不知道怎么复审延期?电子证书怎么弄? 证书过期了不知道怎么复审延期?别慌,很多人在拿到【澳洲水电工证考试】的电子证书后,一不小心就忽略了复审时间,结果证书失效,工作受阻,甚至被单位追责。今天就从【澳洲水电工证考试… · 2026/11/7 0:00:41

电工作业提示版通过率揭秘:怎么考才能一次过?
电工作业提示版通过率揭秘:怎么考才能一次过?

电工作业提示版通过率揭秘:怎么考才能一次过? 怕考不过白交培训费?别急,今天我就从驻马店应届工程类毕业生的视角,带你全面了解电工作业提示版的考试流程、备考要点和真实通过率,帮你少走弯路、提高一次通过率。… · 2026/11/7 0:00:41

电工证年审报名千万别踩坑 外省证转过来要搞清这几点
电工证年审报名千万别踩坑 外省证转过来要搞清这几点

电工证年审报名千万别踩坑 外省证转过来要搞清这几点 之前考的证在外省能不能转过来?这个问题是很多电工从业者最关心的,特别是像你这样在商丘从事公路工程的人员,经常需要跨省流动,证书的 有效性 和 可迁移性… · 2026/11/7 0:00:41

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 10:29:23

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码