动态创建条件变量
int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr);
注销一个条件变量
int pthread_cond_destroy(pthread_cond_t *cond);
无条件等待
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
计时等待
int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec*abstime);
发送单个条件变量成立信号
int pthread_cond_signal(pthread_cond_t *cond)
广播条件变量成立信号
int pthread_cond_ broadcast (pthread_cond_t *cond)
1 #include <pthread.h> 2 #include <stdio.h> 3 #include <unistd.h> 4 #include <stdlib.h> 5 #include <sys/time.h> 6 //声明两个线程 7 void* task1(void *arg); 8 void* task2(void *arg); 9 pthread_t tid[3]; //线程的3个指针 10 pthread_mutex_t lock; //互斥锁指针 11 pthread_cond_t cond; //条件变量指针 12 int main(void) 13 { 14 int ret; 15 16 //初始化互斥锁和条件变量 17 pthread_mutex_init(&lock,NULL); 18 pthread_cond_init(&cond,NULL); 19 //创建2个线程 20 pthread_create(&tid[0],NULL,task1,NULL); 21 pthread_create(&tid[1],NULL,task2,NULL); 22 //等待 23 pthread_join(tid[0],NULL); 24 pthread_join(tid[1],NULL); 25 26 printf("Main:ALL new threads end "); 27 //销毁互斥锁 28 pthread_mutex_destroy(&lock); 29 pthread_exit(NULL); 30 } 31 32 void* task1(void *arg) 33 { 34 struct timeval now; 35 /* 36 struct timeval 37 { 38 time_t tv_sec; // seconds 秒 39 suseconds_t tv_usec; // microseconds 毫秒 40 }; 41 */ 42 struct timespec outtime; 43 /* 44 struct timespec 45 { 46 time_t tv_sec; // seconds 秒 47 long tv_nsec; // and nanoseconds 纳秒 48 }; 49 */ 50 printf("I am task1 "); 51 pthread_mutex_lock(&lock); //上锁 52 printf("task1: wait max time is 5s "); 53 gettimeofday(&now, NULL); //返回自1970-01-01 00:00:00到现在经历的秒数 54 outtime.tv_sec = now.tv_sec + 5; 55 outtime.tv_nsec = now.tv_usec * 1000; 56 pthread_cond_timedwait(&cond, &lock, &outtime);//线程1等待条件变量,最多等待5s 57 printf("task1: coutinue run "); 58 printf("task1: ready to pthread_exit "); 59 60 pthread_exit(NULL); 61 } 62 63 64 void* task2(void *arg) 65 { 66 printf("I am task2 "); 67 sleep(3); //线程2休眠3s后激活条件变量 68 printf("task2: ready to signal the cond "); 69 pthread_cond_signal(&cond); //发送变量成立信号 用来激活条件变量 70 printf("task2: ready to pthread_exit "); 71 pthread_exit(NULL); 72 }
运行后代码如下
1 k1: wait max time is 5s 2 I am task2 3 task2: ready to signal the cond 4 task2: ready to pthread_exit 5 task1: coutinue run 6 task1: ready to pthread_exit 7 Main:ALL new threads end
先运行task1,触发条件变量,跳到task2激活,执行task2的两句话,然后再回到task1执行两句话,最后回到主函数
计时等待:pthread_cond_timedwait();用法:
1 struct timeval now; 2 struct timespec outtime; 3 gettimeofday(&now, NULL);//获取当前时间 4 outtime.tv_sec = now.tv_sec + 5; //设定唤醒的绝对时间是当前时间+5s 5 outtime.tv_nsec = now.tv_usec * 1000; 6 pthread_cond_timedwait(&cond, &lock, &outtime);
用到的两个结构体
1 struct timeval{ 2 long int tv_sec; // 秒数 3 long int tv_usec; // 微秒数 4 } 5 6 7 8 struct timespec { 9 time_t tv_sec; // seconds 秒 10 long tv_nsec; // and nanoseconds 毫秒 11 };