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

多线程的同步

线程之间有依赖操作

//当主线程调用pthread_cond_timedwait(&cond, &mutex, &timeout)时,会自动释放互斥锁,并进入等待状态。这是pthread_cond_wait系列函数的核心特性:
//在等待期间释放锁,被唤醒前重新获取锁。
// pthread_cond_timedwait的原子性
// 释放锁:原子性地释放mutex,允许其他线程获取它。
// 等待条件:阻塞当前线程,等待条件变量cond被信号唤醒或超时。
// 重新获取锁:被唤醒后,线程会重新获取mutex,然后返回。
// 线程协作流程
// 主线程:获取锁 → 检查条件不满足 → 释放锁并等待 → 被唤醒后重新获取锁
// 工作线程:获取锁 → 设置条件 → 发送信号 → 释放锁
 

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <time.h>
#include <unistd.h>
#include <errno.h>pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int ready = 0;void*worker(void*arg)
{sleep(1);printf(" worker 加锁等待条件变量 !\r\n");pthread_mutex_lock(&mutex);ready = 1;pthread_cond_signal(&cond);pthread_mutex_unlock(&mutex);return NULL;
}int main()
{pthread_t tid;struct timespec timeout;int ret;if(pthread_create(&tid,NULL,worker,NULL)!=0){perror("pthread_create \r\n");}clock_gettime(CLOCK_REALTIME,&timeout);timeout.tv_sec +=4;printf("加锁等待条件变量 !\r\n");// 加锁等待条件变量pthread_mutex_lock(&mutex);while(ready == 0){ret = pthread_cond_timedwait(&cond,&mutex,&timeout);if(ret == ETIMEDOUT){printf("等待超时!\r\n");break;}else if(ret != 0){perror(" pthread_cond_timedwait\r\n");pthread_mutex_unlock(&mutex);}}if(ready){printf(" 收到工作线程通知,条件已满足 \r\n");}pthread_mutex_unlock(&mutex);pthread_join(tid,NULL); // return 0;}

gcc pthread_cond.c -o pthread_cond -lpthread

 

http://www.lqws.cn/news/509779.html

相关文章:

  • docker部署oracle数据库
  • Leetcode+JAVA+回溯1
  • i.MX平台下 Linux + FreeRTOS 协同启动与通讯全解(含Yocto实战与核心机制分析)
  • ​CentOS 7 单用户模式重置 root 密码完整指南
  • 无人机神经网络模块运行与技术难点
  • Dify与代理商奇墨科技为企业定制AI应用开发专属方案,适配多样化业务需求
  • vue-25( Composition API 与现有的 Options API 组件集成)
  • 采用ArcGIS10.8.2 进行插值图绘制
  • DEYOLO 全面复现,将双增强跨模态目标检测网络 DEYOLO 融合到 YOLOFuse 框架
  • C++字符大小
  • P0/P1级重大故障根因分析:技术挑战与无指责复盘文化
  • Leaking GAN
  • 医学数据分析实战:冠心病发病因素可视化
  • git学习资源
  • 轨迹降噪API及算法
  • 应用层协议 HTTP
  • 洛谷P1092 [NOIP 2004 提高组] 虫食算
  • openai-agents实现out_guardrails
  • DataSophon 1.2.1集成Flink 1.20并增加JMX 监控
  • [ruby on rails] ActiveJob中 discard_on,retry_on和 rescue_from的应用
  • 用福昕阅读器打开pdf文件,整个程序窗口自动缩小的问题
  • 14.OCR字符识别
  • 10-Python模块详解
  • 猿人学js逆向比赛第一届第十二题
  • 国产化条码类库Spire.Barcode教程:如何使用 C# 读取 PDF 中的条码(两种方法轻松实现)
  • 【前端】JS模块化解析-ESModule
  • C# VB.NET取字符串中全角字符数量和半角字符数量
  • 电机驱动基础
  • Rust 项目实战:多线程 Web 服务器
  • 第1篇:环境搭建与第一个Gin应用