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

标签 c++ multithreading

在这个简单的例子中如何保证

   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/

相关文章:

c++ - 如果在 constexpr 上下文中,如何在 assert() 和 static_assert() 之间分派(dispatch),依赖?

c++ - ebp + 6 而不是 JIT 编译器中的 +8

c++ - 继承成员函数访问数据成员

c++ - 如何使用 boost 从 com 端口读取未定义数量的字节?

使用 pyxs Xenstore 客户端监视 GPIO 引脚的 Python 守护程序

java - 为什么一个线程一旦启动,它就永远不能在java中再次启动

java - 使用线程发送邮件但仍然挂起 Java 中的应用程序

c++ - GCC 无法优化涉及成员函数指针的委托(delegate) lambda 函数

c# - 在 C# - C++/CLI - C++ Windows 窗体应用程序退出之前跟踪 - 并正确结束 - native 和托管线程

c++ - 在多个线程中递减索引