Linux 多线程 - 线程不会按预期产生任何输出

Posted

技术标签:

【中文标题】Linux 多线程 - 线程不会按预期产生任何输出【英文标题】:Linux Multithreading - threads do not produce any output as expected 【发布时间】:2016-11-09 06:22:10 【问题描述】:

我正在学习 Linux 平台中的多线程。我编写了这个小程序来熟悉这些概念。在运行可执行文件时,我看不到任何错误,也没有打印Hi。因此,我在看到输出后让线程休眠。但仍然无法在控制台上看到打印。

我还想知道在运行时打印哪个线程。谁能帮帮我?

#include <iostream>
#include <unistd.h>
#include <pthread.h>

using std::cout;
using std::endl;

void* print (void* data)

      cout << "Hi" << endl;
      sleep(10000000);


int main (int argc, char* argv[])

   int t1 = 1, t2 =2, t3 = 3;
   pthread_t thread1, thread2, thread3;
   int thread_id_1, thread_id_2, thread_id_3;
   thread_id_1 = pthread_create(&thread1, NULL, print, 0);
   thread_id_2 = pthread_create(&thread2, NULL, print, 0);
   thread_id_3 = pthread_create(&thread3, NULL, print, 0);
   return 0;
 

【问题讨论】:

另外,你意识到你让它睡了 100 多天,对吧? 睡上 100 天没什么问题。我每天晚上都这样做。 是的,但我在想操作系统可能不会刷新缓冲区并打印“Hi”,然后 OP 会终止程序,所以什么都不会打印。 仅供参考:std::thread、mutex、async 等是自 C++11 以来 C++ 标准的一部分,并为您提供了一种独立于平台的惯用方式来在现代 C++ 中执行多线程。 IMO 如果您是第一次学习多线程,则没有理由更喜欢 pthreads 而不是符合标准的方式。如果你真的想的话,你可以随时回去学习 pthread。除非你想用纯 C 编写,否则你可以忽略我刚才所说的一切。 【参考方案1】:

您的主线程可能会退出,因此整个进程都会终止。因此,线程没有机会运行。如果线程在主线程退出之前完成执行,即使您的代码原样,您也有可能(非常不可能,但仍然有可能)看到线程的输出。但你不能依赖它。

调用pthread_join(),在main() 中pthread_create() 调用之后的线程上挂起调用线程,直到线程(由线程ID 指定)返回:

pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
pthread_join(thread3, NULL);

您还可以使用pthread_t 的数组,这将允许您在pthread_create()pthread_join() 调用上使用for 循环。

或使用pthread_exit(0) 仅退出主线程,这将仅退出调用线程,其余线程(您创建的线程)将继续执行。

注意你的线程函数应该返回一个指针或NULL:

void* print (void* data)

    cout << "Hi" << endl;
    return NULL;

不确定线程​​退出时是否处于高睡眠状态,这是不必要的,并且会阻止线程退出。可能不是你想要的。

【讨论】:

谢谢 P.P.它对我有用。我认为创建的线程运行得很快,因此我什至看不到打印,因此我将睡眠时间放在打印功能中。没有考虑主线程。 @Jonathan 不,问题将保持不变。 pthread_detach() 只是告诉 pthreads 库没有人在等待它,一旦线程返回/退出,它的资源可以立即释放。但是如果主线程退出(通过exit)或从主线程返回(在这种情况下,进程死亡),它也无济于事。

以上是关于Linux 多线程 - 线程不会按预期产生任何输出的主要内容,如果未能解决你的问题,请参考以下文章

多线程未按预期运行

linux下多进程或者多线程编程的问题。新手,望指教!

如果副本被保存并提供给另一个线程,为什么va_list var-arg副本不能按预期工作?

为啥这些静态函数不按预期从另一个线程返回?

为啥在多线程应用程序 C++ 中没有发生同步

Linux 多线程编程 实例 2