linux线程笔记7

线程的状态转换


条件变量案例改进:

一个线程负责计算结果,多个线程负责获取结果

  1. #include <pthread.h>  
  2. #include <stdio.h>  
  3. #include <stdlib.h>  
  4. typedef struct  
  5. {  
  6.     int                 res;  
  7.     int                 counter;    //用于统计获取结果线程的数量  
  8.     pthread_cond_t  cond;   //条件变量  
  9.     pthread_mutex_t mutex;  //互斥锁  
  10. }Result;  
  11. //计算并将结果放置Result中的线程运行函数  
  12. void *set_fn(void *arg)  
  13. {     
  14.     int i =1,sum = 0;  
  15.     for(;i<=100;i++){  
  16.         sum +=i;  
  17.     }  
  18.     Result *r = (Result *)arg;  
  19.     //将计算结果放置到Result的res中  
  20.     r->res = sum;  
  21.       
  22.     pthread_mutex_lock(&r->mutex);  
  23.     //判断获取结果的线程是否准备好  
  24.     while(r->counter < 2){ // 只有获取结果的线程达到两个才通知 
  25.         pthread_mutex_unlock(&r->mutex);//避免set_fn线程比gei_fn线程先运行出现死锁  
  26.         usleep(100);  
  27.         pthread_mutex_lock(&r->mutex);  
  28.     }  
  29.     pthread_mutex_unlock(&r->mutex);  
  30.       
  31.     //通知唤醒等待那个获取结果的线程  
  32.     pthread_cond_broadcast(&r->cond);  
  33.     return (void *)0;  
  34. }  
  35. //获得结果的线程运行函数  
  36. void *get_fn(void *arg)  
  37. {  
  38.     Result *r = (Result *)arg;  
  39.     //对两个线程共享的判断条件进行保护(加锁)  
  40.     //两个线程对判断条件操作是互斥的  
  41.     pthread_mutex_lock(&r->mutex);  
  42.       
  43.     //代表获取结果的线程已准备好  
  44.     r->counter++;  
  45.       
  46.     //获取结果线程进行等待  
  47.     pthread_cond_wait(&r->cond,&r->mutex);//等待  
  48.     pthreda_mutex_unlock(&r->mutex);  
  49.     //获取计算结果  
  50.     int res = r->res;  
  51.     printf("0x%lx get sum is %d\n",pthread_self(),res);;  
  52.     return (void *)0;  
  53. }  
  54. int main(void)  
  55. {  
  56.     int err;  
  57.     pthread_t cal,get1,get2;  
  58.     Result r;  
  59.     r.counter= 0;  
  60.     pthread_cond_init(&r.cond,NULL);  
  61.     pthread_mutex_init(&r.mutex,NULL);  
  62.     //启动获取结果的线程  
  63.     if((err = pthread_create(&get1,NULL,get_fn,(void*)&r)) != 0){  
  64.         perror("pthread create error");  
  65.     }  
  66.     if((err = pthread_create(&get2,NULL,get_fn,(void*)&r)) != 0){ 
  67. perror("pthread create error");
  68.     }
  69.     //启动计算结果的线程  
  70.     if((err = pthread_create(&cal,NULL,set_fn,(void*)&r)) != 0){  
  71.         perror("pthread create error");  
  72.     }  
  73.       
  74.     pthread_join(cal,NULL);  
  75.     pthread_join(get1,NULL);  
  76.     pthread_join(get2,NULL); 
  77.     pthread_cond_destroy(&r.cond);  
  78.     pthread_mutex_destroy(&r.mutex);  
  79.     return 0;  
  80. }  
编译:gcc  -lpthread **.c -o test
运行:./test
结果:0x1566416 get sum 5050
   0x1562661 get sum 5050

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值