编辑: 我做了一个错误的假设,当它们实际上开始在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