代码之家  ›  专栏  ›  技术社区  ›  northerner

如何避免在循环中破坏和重新创建线程?

  •  -1
  • northerner  · 技术社区  · 4 年前

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

    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;
    }
    

    有没有办法 t1 t2 重新启动?是否有我应该研究的设计模式?我这么问是因为添加线程会使程序稍微变慢,而我本以为它会更快。

    0 回复  |  直到 4 年前
        1
  •  1
  •   g19fanatic    4 年前

    您可以使用 std::async 正如评论中所建议的那样。

    您还试图做的是Threadpool的一个非常常见的用法。我通常使用的简单头实现是 here

    要使用此库,请在循环外创建池,并在构造过程中设置多个线程。那么 enqueue 一个线程将关闭并执行的函数。有了这个图书馆,你会得到一个 std::future (很像std::async步骤),这就是你想要的 wait 在你的循环中。

    一般来说,您希望使用mutexs(或其他方式,有很多方法可以做到这一点)使对任何数据的访问都是线程安全的,但在非常特殊的情况下,您不需要这样做。

    在这种情况下,

    1. 只要向量的大小没有增加(不需要重新分配)
    2. 只阅读项目或只在自己的线程中一次修改每个项目

    您无需担心同步问题。

    不管怎样,同步只是个好习惯。。。当其他人最终修改代码时,他们不会知道你的规则,并会导致问题。