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 多线程 - 线程不会按预期产生任何输出的主要内容,如果未能解决你的问题,请参考以下文章