我有以下代码:
void do_join(std::thread& t)
{
t.join();
}
void join_all(std::vector<std::thread>& v)
{
std::for_each(v.begin(),v.end(),do_join);
}
int main()
{
std::vector<std::thread> myThreads;
for(int i = 1; i <= 3; i++)
{
myThreads.push_back(std::thread(threadMethod));
}
join_all(myThreads);
}
目标是在循环中创建多个线程,将它们添加到线程 vector ,然后迭代向量将它们连接到 main 线程。
这里的问题是,当我的 do_join 方法第一次执行时,它会加入线程并等待,而不是从 vector 加入任何其他线程。那是因为我的线程正在使用一些条件变量并等待其他一些任务完成。似乎 do_join 方法正在等待刚加入的线程完成。
如果我尝试直接在 main 函数中执行 for_each ,也会发生同样的事情。
我们的想法是能够将所有这些线程加入到主线程中,而不是让我们说 do_join 的方法线程,我想这里发生了。我当然可以单独加入并创建它们,因为实际上我不需要它们在向量中(从头开始就知道线程数),但我需要一个向量,因为我的应用程序中的每个线程实际上是使用不同方法的参数,我没有包含在该示例代码中。我只是不想为每个创建和加入的线程创建一个新行。
感谢您的帮助!
编辑: 也许值得一提的是我正在使用Ubuntu。
答案 0 :(得分:4)
join
方法按定义阻止当前线程,直到您尝试加入的线程完成:
阻止当前线程,直到由
*this
标识的线程 完成它的执行。
也就是说,join
的目的阻止其线程直到另一个完成。如果您不希望阻止该线程,请不要使用join
。
你应该问自己一个问题:你想要达到什么目的?如果你希望你的主程序只在完成所有其他线程的情况下继续进行,那么你现在正在做的是正确的,你将不得不等待所有的线程。否则,您可能需要某种方式让其他线程向主要信号发出信号。