gpt4 book ai didi

c++ - Pthread 行为 C++

转载 作者:行者123 更新时间:2023-11-28 04:39:58 26 4
gpt4 key购买 nike

我尝试了一个基本的 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>!

我预计总会有五个“Hello, World!”打印为该程序的输出,但我看到了不同。谁能告诉我为什么?

最佳答案

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

All open stdio(3) streams are flushed and closed.

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

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

想象一下下面的序列:

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

关于c++ - Pthread 行为 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50422743/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com