使用pthread_create时的奇怪输出

时间:2016-04-20 08:19:54

标签: c++ multithreading

考虑下一段代码:

#include <iostream>
#include <pthread.h>
#include <string.h>

using namespace std;

pthread_t tid[3];

void* printMe(void* arg)
{
    pthread_t id = pthread_self();
    if(pthread_equal(id,tid[0]))
    {
        cout << "first thread's in function" << endl;
    }
    if(pthread_equal(id,tid[1]))
    {
        cout << "second thread's in function" << endl;
    }
    if(pthread_equal(id,tid[2]))
    {
        cout << "third thread's in function" << endl;
    }

}

int main() {

    int i = 0;
    int err;

    while (i < 3)
    {
        err = pthread_create(&(tid[i]), NULL, printMe, NULL);

        if (err != 0)
        {
            cout << "failed to create thread number " << i << strerror(i) << endl;
        }
        else
        {
            cout << "main() : creating thread number " << i << endl;
        }

        i++;
    }

    return 0;
}

我不明白线程什么时候调用他的函数? 这是正确的,因为它的创建? (同时,主线程继续创建其他线程?)

此外,我不明白输出 -

main() : creating thread number 0
main() : creating thread number 1
main() : creating thread number 2
first thread's in function
first thread's in function

第一个线程调用了他的函数两次,而其他线程都没有调用它们。

然后,我再次编译并得到 -

main() : creating thread number 0
first thread's in function
main() : creating thread number 1
second thread's in function
main() : creating thread number 2

再次,第三个线程怎么样?

为什么“有时”线程无法调用它们的函数?

2 个答案:

答案 0 :(得分:2)

您的main()在返回之前没有加入线程,从而终止程序,因此无论您看到任何给定线程的输出,它都或多或少是随机的。

答案 1 :(得分:2)

您的main函数在线程运行之前终止。在从main返回之前,您必须等待所有线程的结束。 请参阅此问题:How can I wait for any/all pthreads to complete?

注意:你把它标记为C ++,没有使用C ++ 11或boost的线程的任何理由?