Pthread行为C ++

时间:2018-05-19 07:08:57

标签: c++ pthreads mutex

我尝试了一个基本的pthreads / mutex程序:

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

using namespace std;

pthread_mutex_t mutex;

void* PrintHello(void *t)
{
    int i = reinterpret_cast<int>(t);
    pthread_mutex_lock(&mutex);
    cout<<"Hello, World thread <"<<i<<">!"<<endl;
    pthread_mutex_unlock(&mutex);
    pthread_exit(NULL);
}

int main()
{
    pthread_t threadId[5];
    pthread_mutex_init(&mutex, NULL);

    for(int i = 0; i < 5; i ++)
    {
        int rc = pthread_create(&threadId[i], NULL, PrintHello, reinterpret_cast<void *>(i + 1));
    }

    return 0;
}

我得到以下输出:

执行1:

Hello, World thread <1>!
Hello, World thread <2>!
Hello, World thread <3>!
Hello, World thread <4>!
Hello, World thread <4>!
Hello, World thread <5>!

执行2:

Hello, World thread <1>!
Hello, World thread <2>!
Hello, World thread <3>!
Hello, World thread <4>!
Hello, World thread <5>!
Hello, World thread <5>!

我预计会有五个'你好,世界!'打印作为此程序的输出,但我看到不同。谁能告诉我为什么?

1 个答案:

答案 0 :(得分:1)

当主线程从main函数返回时,它通过调用exit函数使进程退出。根据{{​​3}},它会刷新stdout

  

所有打开的stdio(3)流都被刷新并关闭。

有可能因为你没有加入你的线程,主线程会刷新stdout,而另一个线程仍在写入它。因为刷新是在std::cout的析构函数中完成的,所以它不需要像通常那样使用锁定(因为使用被破坏的对象是未定义的行为)。

另请注意,std::endl都会向流中添加换行符并将其刷新。

想象一下以下序列:

  1. 主题1-4打印他们的消息并冲洗它。
  2. 线程5打印其消息。
  3. 主线程退出并刷新流,这是在不保持std::cout的常用内部锁定的情况下完成的。
  4. 线程5开始刷新std::cout,再次刷新与步骤3中相同的消息。