我有一个创建并使用两个线程的循环。线程总是做同样的事情,我想知道如何重用它们,而不是在每次迭代中创建和销毁它们?循环内还会执行其他一些操作,这些操作会影响线程处理的数据。这是一个简化的示例:
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
重新启动?有没有我应该研究的设计模式?我问,因为添加线程使程序在我认为会更快时会稍微慢一些。
最佳答案
您可以按照注释中的建议使用 std::async
。
您还要尝试的是Threadpool的一种非常常见的用法。我通常使用的简单的仅 header 实现是here
要使用此库,请在循环外部创建池,并在构造过程中设置多个线程。然后enqueue
一个将关闭线程并执行的函数。有了这个库,您将得到一个 std::future
(非常类似于std::async步骤),这就是您在循环中使用 wait
的方式。
通常,您希望使用互斥锁访问任何线程安全的数据(或其他方法,可以通过多种方法来执行此操作),但是在非常特殊的情况下,则不需要这样做。
在这种情况下,
您将不必担心同步。
尽管无论如何都是进行同步的好习惯……当其他人最终修改代码时,他们不会知道您的规则,并且会引起问题。
关于c++ - 如何避免在循环内破坏和重新创建线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60896525/