編輯: 我做了一個錯誤的假設,當它們實際上開始在pthread_create
上運行時,線程開始在pthread_join
上運行。pthread_join()是否允許執行調用線程繼續?
我學習使用POSIX線程,和我讀過:
pthread_join() - wait for thread termination
所以,代碼樣本中,主要的退出(0)沒有達到,直到兩個啓動的線程結束。
但是在第一次調用pthread_join()之後,main繼續執行,因爲第二次調用pthread_join()實際上運行,並且中間的消息被打印。
那麼這是怎麼回事?當兩個線程還沒有完成時,main是否繼續執行?或不是嗎?
我知道這不是一種可靠的測試方法,但是無論循環多長時間,在兩個線程完成後總是會打印第二條測試消息。 (至少在我的機器上時,我試了一下)
void *print_message_function(void *ptr)
{
char *message = (char *) ptr;
for(int a = 0; a < 1000; ++a)
printf("%s - %i\n", message, a);
return NULL;
}
//
int main(int argc, char *argv[])
{
pthread_t thread1, thread2;
char message1[] = "Thread 1";
char message2[] = "Thread 2";
int iret1, iret2;
//
iret1 = pthread_create(&thread1, NULL, print_message_function, (void*) message1);
iret2 = pthread_create(&thread2, NULL, print_message_function, (void*) message2);
//
pthread_join(thread1, NULL);
printf("Let's see when is this printed...\n");
pthread_join(thread2, NULL);
printf("And this one?...\n");
//
printf("Thread 1 returns: %d\n",iret1);
printf("Thread 2 returns: %d\n",iret2);
exit(0);
}
哦對,因爲線程已經在pthread_create上啓動了。 thx – Petruza