c++ - 如何避免在循环内破坏和重新创建线程?

标签 c++ multithreading design-patterns

我有一个创建并使用两个线程的循环。线程总是做同样的事情,我想知道如何重用它们,而不是在每次迭代中创建和销毁它们?循环内还会执行其他一些操作,这些操作会影响线程处理的数据。这是一个简化的示例:

const int args1 = foo1();
const int args2 = foo2();
vector<string> myVec = populateVector();
int a = 1;
while(int i = 0; i < 100; i++)
{
    auto func = [&](const vector<string> vec){
        //do stuff involving variable a
        foo3(myVec[a]);
    }
    thread t1(func, args1);
    thread t2(func, args2);
    t1.join();
    t2.join();

    a = 2 * a;
}

有没有办法让t1t2重新启动?有没有我应该研究的设计模式?我问,因为添加线程使程序在我认为会更快时会稍微慢一些。

最佳答案

您可以按照注释中的建议使用 std::async

您还要尝试的是Threadpool的一种非常常见的用法。我通常使用的简单的仅 header 实现是here

要使用此库,请在循环外部创建池,并在构造过程中设置多个线程。然后enqueue一个将关闭线程并执行的函数。有了这个库,您将得到一个 std::future (非常类似于std::async步骤),这就是您在循环中使用 wait 的方式。

通常,您希望使用互斥锁访问任何线程安全的数据(或其他方法,可以通过多种方法来执行此操作),但是在非常特殊的情况下,则不需要这样做。

在这种情况下,

  • ,只要不增加 vector 的大小(无需重新分配)
  • 仅读取项目或仅在其自己的线程中一次修改每个项目

  • 您将不必担心同步。

    尽管无论如何都是进行同步的好习惯……当其他人最终修改代码时,他们不会知道您的规则,并且会引起问题。

    关于c++ - 如何避免在循环内破坏和重新创建线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60896525/

    相关文章:

    c++ - 为什么C++线程/future开销这么大

    design-patterns - 在哪里放置不是模型但作用于模型的类

    iphone - 在 iPhone Development/Objective-C 中初始化实例变量

    c++ - 作为可变参数模板的结构化参数

    java - 在android中的asynctask中等待一个异步任务

    c - FD_ACCEPT 如何接受多线程的连接请求?

    java - Exception() 的用例

    c++ - Sublime text 2 c++错误信息(无磁盘)

    C++基类指针、集合类

    c++ - 从图像生成轮廓