C ++ 11 std :: thread以单独的方法连接到主线程

时间:2015-05-10 12:39:08

标签: c++ multithreading c++11

我有以下代码:

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。

1 个答案:

答案 0 :(得分:4)

join方法按定义阻止当前线程,直到您尝试加入的线程完成:

  

阻止当前线程,直到由*this标识的线程   完成它的执行。

From here.

也就是说,join目的阻止其线程直到另一个完成。如果您不希望阻止该线程,请不要使用join

你应该问自己一个问题:你想要达到什么目的?如果你希望你的主程序只在完成所有其他线程的情况下继续进行,那么你现在正在做的是正确的,你将不得不等待所有的线程。否则,您可能需要某种方式让其他线程向主要信号发出信号。