[英]C++11 std::thread join to main thread in a separate method
我有以下代码:
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);
}
目标是在一个循环中创建多个线程,将它们添加到线程向量中 ,然后遍历该向量将它们连接到主线程。
这里的问题是,当我的do_join方法首次执行时,它会加入线程并等待,而不是从vector中加入任何其他线程。 那是因为我的线程正在使用一些条件变量,并等待其他一些任务完成。 好像do_join方法正在等待刚刚加入的线程完成。
如果我尝试直接在主函数中执行for_each,则会发生相同的事情。
这个想法是要能够将所有这些线程连接到主线程,而不是让我假设do_join的方法线程发生在这里。 我当然可以参加,并分别创建它们,因为实际上我并不需要他们在一个载体(线程数从一开始就知道),但我需要一个载体,因为在我的应用程序的每个线程使用实际创建我没有包含在该示例代码中的不同方法的参数。 我只是不想为每个创建和加入的线程添加新行。
感谢您的任何帮助!
编辑:也许值得一提的是,我正在使用Ubuntu。
根据定义 , join
方法会阻塞当前线程,直到您尝试加入的线程完成为止:
阻塞当前线程,直到由
*this
标识的线程完成执行。
( 从这里开始。 )
也就是说,它的目的 join
挡住了它的线程,直到另一个结束。 如果您不希望该线程被阻塞,则不要使用join
。
您应该问自己一个问题:您要达到什么目标? 如果您希望主程序仅在所有其他线程都完成后才继续运行,那么您现在正在做的事情是正确的,无论如何,您都必须等待所有线程。 否则,您可能需要某种方式让其他线程向主要线程发出信号,告知它们已完成。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.