奇怪的线程打印行为

时间:2010-01-28 18:28:34

标签: c++ multithreading pthreads

嘿 - 我写了一个小玩具程序时出现了一个奇怪的问题,试试线程 这是我的代码:

#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没有被注释掉,线程打印得很好 但是,没有它,线程根本不会打印任何内容。

有任何帮助吗?

4 个答案:

答案 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