线程为什么需要 join

  1. join干嘛

    • 线程和函数

      • 线程在另一个核心上干另一件事和当前线程一起干活。

      • 多线程一般是用于干两件不同的事情。

      • 函数则是有先后顺序。

    • 案例

      • 假如我有分身,一个分身在学校学习,一个分身在外面玩儿。

      • 两个分身各自独立,在完成任务后,在家里同步进度,只需要知道最终结果即可。(三傻大闹宝莱坞的代读)

      • 同理,一个做任务分发,另一个线程则干活。任务分发的线程就只需要分发任务,然后等待工作线程的结果就行。

      • 怎么获取?join的方式等待,然后获取返回值。

    • 一个工人

      [root@localhost test]# cat test.cpp
      #include<stdio.h>
      #include<pthread.h>
      
      void * EarnMoney(void * arg) {
         long to_earn = (long)arg;
         long earned  = to_earn -2;
         printf("mygoal %d yuan,earn %d yuan\n",to_earn,earned);
         return (void*)earned;
      }
      
      int main() {
         int earned = (long)EarnMoney((void*)10);
         printf("earned %d\n",earned);
      }
      [root@localhost test]# gcc test.cpp
      [root@localhost test]# ./a.out
      mygoal 10 yuan,earn 8 yuan
      earned 8
      
      
      • 一个老板(main)一个工人(EarnMoney)给他赚钱.目标是10块,只赚了8块.

      • 怎么知道赚了多少呢?EarnMoney返回值.

    • 多个工人

      [root@localhost test]# g++ test.cpp -pthread
      [root@localhost test]# ./a.out
      I'am worker 3,mygoal 30 yuan,earn 28 yuan
      I'am worker 4,mygoal 40 yuan,earn 38 yuan
      I'am worker 2,mygoal 20 yuan,earn 18 yuan
      I'am worker 5,mygoal 50 yuan,earn 48 yuan
      I'am worker 1,mygoal 10 yuan,earn 8 yuan
      I'am worker 6,mygoal 60 yuan,earn 58 yuan
      I'am worker 7,mygoal 70 yuan,earn 68 yuan
      I'am worker 8,mygoal 80 yuan,earn 78 yuan
      I'am worker 9,mygoal 90 yuan,earn 88 yuan
      worker 1 earned: 8
      worker 2 earned: 18
      worker 3 earned: 28
      worker 4 earned: 38
      worker 5 earned: 48
      worker 6 earned: 58
      worker 7 earned: 68
      worker 8 earned: 78
      worker 9 earned: 88
      I'am worker 10,mygoal 100 yuan,earn 98 yuan
      worker 10 earned: 98
      total earned 530
      [root@localhost test]# cat test.cpp
      #include<stdio.h>
      #include<pthread.h>
      
      void * EarnMoney(void * arg) {
         long to_earn = (long)arg;
         long earned  = to_earn -2;
         printf("I'am worker %d,mygoal %d yuan,earn %d yuan\n",to_earn/10,to_earn,earned);
         return (void*)earned;
      }
      
      #define WORKN 10
      
      int main() {
         pthread_t workers[WORKN];
         int i;
         for(i = 0 ; i < WORKN ; i++) {
             pthread_create(workers+i,NULL,EarnMoney,(void*)(long)((i+1)*10));
         }
         long earned_money = 0;
         for(i = 0 ; i < WORKN ; i++) {
             long worker_earned = 0;
             pthread_join(workers[i],(void**)&worker_earned);
             printf("worker %d earned: %d\n",i+1, worker_earned);
             earned_money += worker_earned;
      
         }
         printf("total earned %d\n",earned_money);
      }
      
      
      • 可以根据输出看到,老板一个个获取工人的返回值,即工人打工完成.

      • 然后老板最后汇总得到530元.

  2. join带来的问题

    • 说明

      • join,用于存放返回值的内存不会释放.浪费资源.

    • 问题

      • 可能会因为某些工作长,某些工作很短的原因,join是串行的,导致大量的资源得不到释放.

      • 也会带来内存问题。

    • 修改方案

      • 设置detach的模式,表示对返回值不感兴趣,直接释放.(有待考究)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值