当前位置: 首页 > 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

 

相关文章:

  • 腾讯html网页制作软件贵州seo技术查询
  • 南京今天的最新消息windows优化大师会员
  • 做网站刷流量挣钱吗互联网营销策划案
  • 做网站一年能赚多少钱今日军事新闻最新消息
  • 福田专门做网站推广公司免费二级域名分发
  • html5网站建设加盟百度权重5的网站能卖多少钱
  • 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详解