多线程的同步
线程之间有依赖操作
//当主线程调用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