【问题标题】:Posix Thread Hangs after other threads exit?Posix 线程在其他线程退出后挂起?
【发布时间】:2014-06-15 00:04:45
【问题描述】:

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() "Joined Thread 1/2" 的输出显示)

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

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

好像是休眠了,放弃了CPU却再也回不来了.....?

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

有什么解决办法吗?

谢谢。

【问题讨论】:

  • 其实,可能就是这样。在您等待之前,可能没有刷新标准输出。在等待这种情况之前,您可以 fflush() 打印到哪个流吗?
  • 如果不是太复杂,或者至少是相关部分,您能否发布线程 1、2 和 3 的代码?
  • @iwillnotexist-idonotexist:好的,让我检查一下等待并在它之前尝试刷新,我不打算发布代码....
  • 只需锁定/解锁/等待逻辑就足够了。
  • 糟糕。应该在发帖前做我的研究。见这里:stackoverflow.com/questions/5229096/…。它似乎对我来说大部分时间都有效,但显然并不总是有效。

标签: c linux multithreading ubuntu posix


【解决方案1】:

正如 cmets/chat 中所确认的,问题不在于线程 3 没有打印任何输出,而是输出被 printf() 缓冲。

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

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

setbuf(stdout, NULL);

【讨论】:

    猜你喜欢
    • 2018-09-05
    • 2011-06-08
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    • 2017-03-03
    相关资源
    最近更新 更多