C 11 std ::线程以单独的方法加入主线程

C++11 std::thread join to main thread in a separate method

本文关键字:线程 方法 std 单独      更新时间:2023-10-16

我有以下代码:

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 thread。>

问题是,当我的 do_join 方法第一次执行时,它加入线程并等待,而不是从a vector 中加入任何其他线程。那是因为我的线程正在使用一些条件变量,并等待其他一些任务完成。好像 do_join 方法正在等待加入线程完成。

如果我直接在 main 函数中尝试 for_each ,也会发生同样的事情。

这个想法是能够将所有这些线程连接到 main 线程,而不是我想在这里发生的 do_join do_join 的方法线程。我当然可以分别加入并分别创建它们,因为实际上我不需要它们进入向量(从一开始就知道线程的数量),但是我需要一个向量,因为实际上使用了我的应用程序中的每个线程我未包含在该示例代码中的不同方法的参数。我只是不想为正在创建和加入的每个线程的新线路。

谢谢您的任何帮助!

编辑:也许值得一提的是我正在使用Ubuntu。

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

阻止当前线程直到 *this识别的线程 完成其执行。

(从这里。)

也就是说, join目的阻止其线程直到另一个螺纹结束。如果您不希望该线程被阻止,则不要使用join

您应该问自己一个问题:您要实现什么?如果您只想在所有其他线程完成时才继续进行主程序,那么您现在正在做的事情是正确的,无论如何,您都必须等待所有线程。否则,您可能需要某种方法才能向其他线程发出信号。