C ++对线程感到困惑

时间:2010-02-10 02:03:03

标签: c++ multithreading g++

基本上这就是我所拥有的:

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;出口。永远不会显示该消息(这有多奇怪)。

我做错了吗?

6 个答案:

答案 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_exitpthread_join上的联机帮助页。

答案 5 :(得分:0)

我认为您的问题已在上面得到解答,但您可能还想查看Boost线程库,如果您使用Windows,可以更轻松地跨平台,还有一个很好的面向对象的界面。