在为该线程评论pthread_join时多次执行相同的线程子例程

我是线程新手。 这里如果我评论pthread_join(thread1,NULL),那么在输出中有时我会得到

Thread2 Thread1 Thread1 

我无法理解为什么Thread1跟踪会出现两次以及pthread_join的确切function是什么。

另外,请参考一些关于初学者的线程概念的教程。

  void *print_message_function( void *ptr ); main() { 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); pthread_join( thread2, NULL); printf("Thread 1 returns: %d\n",iret1); printf("Thread 2 returns: %d\n",iret2); exit(0); } void *print_message_function( void *ptr ) { char *message; message = (char *) ptr; printf("%s \n", message); } 

如果我得到这些结果,首先我会做以下事情:

1)而不是下面的线,

 iret1 = pthread_create( &thread1, NULL, print_message_function, (void*) message1); iret2 = pthread_create( &thread2, NULL, print_message_function, (void*) message2); pthread_join( thread1, NULL); pthread_join( thread2, NULL); 

替换它,

 iret1 = pthread_create( &thread1, NULL, print_message_function, (void*) message1); pthread_join( thread1, NULL); iret2 = pthread_create( &thread2, NULL, print_message_function, (void*) message2); pthread_join( thread2, NULL); 

看看结果是什么。

2)在你的线程函数中,你需要调用pthread_exit(“Exit”); 这是退出线程函数的正确方法。 在function结束时这样做。

 void *print_message_function( void *ptr ) { char *message; message = (char *) ptr; printf("%s \n", message); pthread_exit("Exit"); } 

如果你这样做,理想情况下你不应该遇到任何问题。 在每种情况下,我假设您正在使用gcc -D_REENTRANT -o threadex threadex.c -lpthread编译程序gcc -D_REENTRANT -o threadex threadex.c -lpthread

这不是最终解决方案。 如果进展顺利,那么我们可以继续下一步启动两个线程。

请在合并这些更改后分享反馈。

也许输出缓冲区没有正确刷新。 我在执行multithreading并将输出传递给文件时遇到了一个非常类似的问题 – 有时输出会出现两次。 尝试将此行添加到主函数中:

 setvbuf(stdout, NULL, _IONBF, 0); 

这将强制在每次写入时刷新输出缓冲区。