我在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()调用不确保任何类型的线程执行顺序。它只是挂起调用线程,直到被调用的线程返回(完成执行)。