pthread join是否真的挂起了调用线程

时间:2016-11-11 09:02:19

标签: c join pthreads

我在主要的

中看过如下的工作示例
pthread_t sa[12];
for(i=0;i<12;i++)
   pthread_create(&sa[i],NULL,&matrix_mult,NULL);
for(i=0;i<12;i++)
    {   if(sa[i]!=(int)NULL)
        {   pthread_join(sa[i],NULL);
        }
    }

当所有pthreads终止时,这是否意味着主要目的? 实际上,我正在编写一个代码,其中sa [3]在sa [0]之前结束 所以我添加了

pthread_join(sa[0],NULL);

在sa [3]的函数结尾 希望sa [3]仅在sa [0]结束后终止。 它没有发生。 我在哪里想错了?

1 个答案:

答案 0 :(得分:2)

  

当所有pthreads终止时,这是否意味着主要目的?

  

实际上,我正在编写一个代码,其中sa [3]在sa [0]

之前结束

这当然是可能的。但主线程等待s [0]。 s [1],..等等。这并不意味着,当主等待s [0]时,s [3]无法完成执行。

  

在sa [3]的函数结尾处希望sa [3]仅在sa [0]结束后终止。它没有发生。

绝对没有关于哪些线程首先完成执行或最后执行等的命令。任何线程都可以随时完成执行。 pthread_join()在main中调用的内容是主线程在继续之前等待所有线程的完成。

当主线程在线程s[x]pthread(s[x], NULL);)上等待时,线程s[y]完成执行,然后主线程仍将继续等待s[x]。在主线程调用pthread_join(s[y], NULL);pthread_join()的某个时刻 将立即返回 ,因为线程s[y]已经完成执行。

简而言之,pthread_join()调用确保任何类型的线程执行顺序。它只是挂起调用线程,直到它调用的线程返回(完成执行)。