在这个简单的例子中如何保证
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/