C - pthread join真的会挂起调用线程



我在main

中看到过这样的工作示例
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);
        }
    }

这是否意味着main在所有pthread结束时结束?实际上,我写的代码中sa[3]在sa[0]之前结束所以我添加了

pthread_join(sa[0],NULL);

in end of function for sa[3]希望sa[3]在sa[0]结束后才会终止。但这并没有发生。我想错了吗?

这是否意味着main在所有pthread结束时结束?

是的。

实际上,我写的代码中sa[3]在sa[0]之前结束

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

in end of function for sa[3],希望sa[3]只在sa[0]结束后才终止。

绝对没有顺序关于哪个线程第一个或最后一个完成执行等等。任何线程都可以在任何时间完成执行。main中的pthread_join()调用确保主线程在继续之前等待所有线程的完成。

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

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

最新更新