基本上这就是我所拥有的:
Server::
Server (int port) {
cout << "Initializing server.\n";
(...)
pthread_t newthread;
pthread_create(&newthread, NULL, &Server::_startListening, NULL);
cout << "Exit\n";
pthread_exit(NULL); // <-- Question
}
void* Server::_startListening (void* param) {
cout << "Start listening for clients ...\n";
return 0;
}
问题: 如果我没有把pthread_exit(NULL);在代码中,它将在我在Linux(Ubuntu)上编译它时工作,但它不适用于Mac OSX 10.6.2。当我在linux上编译并运行它时,它会说“初始化服务器”,“开始侦听客户端”,“退出”,而在Mac OSX上则会显示“为服务器初始化”,“退出”,“开始侦听客户端”。
问题似乎发生在pthread_exit周围,如果我把它放在cout&lt;&lt;出口。永远不会显示该消息(这有多奇怪)。
我做错了吗?
答案 0 :(得分:7)
您可能打算使用pthread_join而不是退出。
答案 1 :(得分:3)
问题似乎发生在pthread_exit周围,如果我把它放在cout&lt;&lt;出口。永远不会显示该消息(这有多奇怪)。
一点儿都不奇怪。当您调用pthread_exit时,当前线程将停止执行。因为只有在那个线程中你才会显示“退出”,一旦该线程消失,就没有什么可以打印它了。
关于“退出”和“开始聆听”的不同印刷顺序。每个都由一个单独的线程打印。因为没有同步,所以可以先打印。
答案 2 :(得分:1)
输出的顺序是不确定的。这就是并发意味着什么!另外两个答案是正确的:pthread_exit在你的输出杀死主线程之前你可能打算在主退出之前加入。
答案 3 :(得分:0)
线程(调度等)取决于操作系统。看起来在Linux上,您的操作系统在继续主线程之前将上下文切换到新线程,而在Mac OS上,它将在切换上下文之前继续执行当前线程。因为这是依赖于操作系统的,除非你进行某种同步,否则没有可靠的方法来告诉两个线程的哪一行将首先执行,甚至你测试的“linux将切换上下文”的结果也是不可靠的。
pthread_exit,如上所述,退出当前活动线程(即:main()),而不是任何其他线程(_startListning)。您可能正在寻找加入(pthread_join)另一个线程,而不是退出当前线程。
答案 4 :(得分:0)
pthread_exit
应该从你想要停止的线程中调用。从main()
线程调用它将终止主线程,程序将一直运行,直到侦听器线程退出。
建议您阅读pthread_exit
和pthread_join
上的联机帮助页。
答案 5 :(得分:0)
我认为您的问题已在上面得到解答,但您可能还想查看Boost线程库,如果您使用Windows,可以更轻松地跨平台,还有一个很好的面向对象的界面。