#include <pthread.h>
#include <iostream>
using std::cout;
using std::endl;
void *threadFunc(void *arg) {
cout << "I am a thread. Hear me roar." << endl;
pthread_exit(NULL);
}
int main() {
cout << "Hello there." << endl;
int returnValue;
pthread_t myThread;
returnValue = pthread_create(&myThread, NULL, threadFunc, NULL);
if (returnValue != 0) {
cout << "Couldn't create thread! Whoops." << endl;
return -1;
}
return 0;
}
主要的第一个cout没有被注释掉,线程打印得很好 但是,没有它,线程根本不会打印任何内容。
有任何帮助吗?
答案 0 :(得分:5)
试试这个:
#include <pthread.h>
#include <iostream>
using std::cout;
using std::endl;
void *threadFunc(void *arg) {
cout << "I am a thread. Hear me roar." << endl;
pthread_exit(NULL);
}
int main() {
//cout << "Hello there." << endl;
int returnValue;
pthread_t myThread;
returnValue = pthread_create(&myThread, NULL, threadFunc, NULL);
if (returnValue != 0) {
cout << "Couldn't create thread! Whoops." << endl;
return -1;
}
pthread_join( myThread, NULL);
return 0;
}
我的代码和你的代码之间的区别是一行 - pthread join。这将挂起主线程,直到子线程有机会完成其操作。
在你的代码中,执行到达第一个cout并进行处理。然后,您拆分另一个线程,主线程一直持续到结束,在辅助线程整理之前可能会或可能不会到达。这就是奇怪行为的来源 - 您遇到的情况是主程序在子线程有机会之前完成的情况,因此程序已“返回”并且整个批次由内核清理。 / p>
答案 1 :(得分:2)
这是一个竞争条件,允许程序在主循环运行一段时间时工作。在线程甚至有机会运行之前,您的程序正在退出。
在从main()返回之前,您应该等待线程完成(参见pthread_join
)。
答案 2 :(得分:0)
它在一个案例中起作用的事实是纯粹的运气。你有一个计时问题,这是你的程序在你的线程工作之前退出。
当main()
退出时,所有线程都会死亡。你需要某种等待来让其他线程有时间在main()
退出之前运行。在创建工作线程后尝试在cin
中添加main()
,看看会发生什么。
最终,您需要某种运行循环和消息传递/事件来在线程之间进行通信。
-Jeff
答案 3 :(得分:0)
尝试在pthread_exit(NULL);
之前的main末尾添加return 0
。我怀疑问题是你的main
返回,并且该进程在线程有机会打印之前退出。从main
打印可能会以某种方式修改时间,以便线程 有机会打印 - 但这只是纯粹的运气。在完成所有线程完成工作之前,您需要确保main不会返回。从main调用pthread_exit
允许其他线程继续运行,直到它们也调用pthread_exit
。