线程的状态转换
条件变量案例改进:
一个线程负责计算结果,多个线程负责获取结果
- #include <pthread.h>
- #include <stdio.h>
- #include <stdlib.h>
- typedef struct
- {
- int res;
- int counter; //用于统计获取结果线程的数量
- pthread_cond_t cond; //条件变量
- pthread_mutex_t mutex; //互斥锁
- }Result;
- //计算并将结果放置Result中的线程运行函数
- void *set_fn(void *arg)
- {
- int i =1,sum = 0;
- for(;i<=100;i++){
- sum +=i;
- }
- Result *r = (Result *)arg;
- //将计算结果放置到Result的res中
- r->res = sum;
- pthread_mutex_lock(&r->mutex);
- //判断获取结果的线程是否准备好
- while(r->counter < 2){ // 只有获取结果的线程达到两个才通知
- pthread_mutex_unlock(&r->mutex);//避免set_fn线程比gei_fn线程先运行出现死锁
- usleep(100);
- pthread_mutex_lock(&r->mutex);
- }
- pthread_mutex_unlock(&r->mutex);
- //通知唤醒等待那个获取结果的线程
- pthread_cond_broadcast(&r->cond);
- return (void *)0;
- }
- //获得结果的线程运行函数
- void *get_fn(void *arg)
- {
- Result *r = (Result *)arg;
- //对两个线程共享的判断条件进行保护(加锁)
- //两个线程对判断条件操作是互斥的
- pthread_mutex_lock(&r->mutex);
- //代表获取结果的线程已准备好
- r->counter++;
- //获取结果线程进行等待
- pthread_cond_wait(&r->cond,&r->mutex);//等待
- pthreda_mutex_unlock(&r->mutex);
- //获取计算结果
- int res = r->res;
- printf("0x%lx get sum is %d\n",pthread_self(),res);;
- return (void *)0;
- }
- int main(void)
- {
- int err;
- pthread_t cal,get1,get2;
- Result r;
- r.counter= 0;
- pthread_cond_init(&r.cond,NULL);
- pthread_mutex_init(&r.mutex,NULL);
- //启动获取结果的线程
- if((err = pthread_create(&get1,NULL,get_fn,(void*)&r)) != 0){
- perror("pthread create error");
- }
- if((err = pthread_create(&get2,NULL,get_fn,(void*)&r)) != 0){
- perror("pthread create error");
- }
- //启动计算结果的线程
- if((err = pthread_create(&cal,NULL,set_fn,(void*)&r)) != 0){
- perror("pthread create error");
- }
- pthread_join(cal,NULL);
- pthread_join(get1,NULL);
- pthread_join(get2,NULL);
- pthread_cond_destroy(&r.cond);
- pthread_mutex_destroy(&r.mutex);
- return 0;
- }
编译:gcc -lpthread **.c -o test
运行:./test
结果:0x1566416 get sum 5050
0x1562661 get sum 5050