Posix线程在其他线程退出后挂起?

时间:2014-06-15 00:04:46

标签: c linux multithreading ubuntu posix

3个主题:

pthread_create(&thread1, 
               &NULL,        
               Thread1,
               NULL);
pthread_create(&thread2, 
               &NULL,        
               Thread2,
               NULL);
pthread_create(&thread3, 
               &NULL,        
               Thread3,
               NULL);

printf("\n\nThreads Created\n");

    pthread_join(thread1,0);
    printf("Joined Thread1\n");

    pthread_join(thread2,0);
    printf("Joined Thread2\n");

    pthread_join(thread3,0);
    printf("Joined Thread3\n");

3个线程运行一段时间并根据控制台的输出,似乎正在工作。

最终,线程1和2在完成工作后死亡(从maint()输出显示正确“显示”已加入线程1/2“

现在,第3个主题仍有一些工作要做,看起来不错。然后,接近处理它的最后几个项目,它“出现”线程3刚刚挂起。它将打印出一些东西到控制台,甚至不会完成句子。

线程3具有小睡眠,锁定和解锁互斥锁(线程1和2正在使用)和条件等待。似乎没有在条件等待中,因为我在调用它之前直接打印出来并且没有看到它。

好像是睡觉,放弃了CPU然后又回来了.....?

还有其他任何可能性或原因吗?

任何解决方案?

感谢。

1 个答案:

答案 0 :(得分:2)

正如评论/聊天中所证实的,问题不在于线程3没有打印任何输出,而是输出被printf()缓冲。

您可以使用fflush()来刷新它,或使用\n来刷新stdout,因为它通常是行缓冲的。

或者您可以使用setbuf()完全禁用缓冲。

setbuf(stdout, NULL);