当前位置: 首页 > 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.dtcms.com/a/258789.html

相关文章:

  • k8s强制删除podpvpvc和nsnamespace
  • 人机交互动画制作新突破!文本驱动扩散框架HOIDiNi:一句话驱动虚拟人高精度操作物体。
  • GitHub Actions 的深度解析与概念介绍
  • Java8新特性_加强版
  • 采用ArcGIS10.8.2 进行插值图绘制
  • STM32MPU6050 dmp库
  • MyBatis-Plus:从入门到进阶
  • 如何将OBJ文件转成GLB文件
  • NVIDIA GPU架构学习笔记
  • 时序数据库IoTDB可实现的基本操作及命令汇总
  • Linux操作系统Nginx Web服务
  • 16、nrf52840蓝牙学习(唯一ID加密与解密)
  • VRRP:解决路由器单点故障的终极方案
  • wpa_supplicant连接到了路由,但是 udhcpc会分配到不同网段的ip,路由器ip为192.168.0网段,板子分配ip为192.168.1的网段
  • 2025.6.24总结
  • 数组题解——​合并区间【LeetCode】
  • Python 猜数字小游戏:Tkinter 实现的互动猜数挑战
  • json.decoder.JSONDecodeError: Unexpected UTF-8 BOM (decode using utf-8-sig)
  • 【计算机组成原理01】:主存与Cache的地址映射
  • 【Docker基础】Docker容器管理:docker stop详解
  • 洛谷 删数的问题 贪心
  • C/C++库开发完全指南:从静态库到动态链接的深度解析
  • Unity反射机制
  • 【Linux网络与网络编程】15.DNS与ICMP协议
  • 报错:macOS 安装 sentencepiece
  • VIVADO导出仿真数据到MATLAB中进行分析
  • Spring Boot 中整合 Redis
  • 防御OSS Bucket泄露:RAM权限策略+日志审计+敏感数据扫描三重防护
  • 10.多进程服务器端
  • 复制 生成二维码