gpt4 book ai didi

c++ - C++中的有序多线程输出

转载 作者:搜寻专家 更新时间:2023-10-31 01:53:01 26 4
gpt4 key购买 nike

这个简单示例中的人如何保证

   a->push_back(i)

按照线程启动的顺序发生?所以内容将是 {1,2,3}。

#include <vector>
#include <thread>

void do_stuf(int i,std::vector<int> * a)
{
//do very long stuff
a->push_back(i);
}


int main()
{
std::vector<int> tmp;
std::thread t1(do_stuf,1,&tmp);
std::thread t2(do_stuf,2,&tmp);
std::thread t3(do_stuf,3,&tmp);

t1.join();
t2.join();
t3.join();
}

最佳答案

一种方法是向线程传递一个指针或引用,指向您希望它们存储结果的位置(并确保它在线程生命周期内保持分配状态),如下所示:

void do_stuf(int i, int* a)
{
//do very long stuff
*a = i;
}


int main()
{
std::vector<int> tmp(3);
std::thread t1(do_stuf,1,&tmp[0]);
std::thread t2(do_stuf,2,&tmp[1]);
std::thread t3(do_stuf,3,&tmp[2]);

t1.join();
t2.join();
t3.join();
}

从您的示例中不清楚您要实现的目标,但您是否看过 std::promise 和 std::future 并弄清楚它们的作用?它们可能就是您想要的。

(在这种情况下 vector::push_back 的问题在于它不是线程安全的。如果两个 push_backs 执行重叠,它可能会覆盖相同的元素,或者它可能会重新分配数组移动所有元素的存储位置.)

关于c++ - C++中的有序多线程输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11746756/

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