在c ++ 11中退出程序之前等待多个线程完成的正确方法

时间:2016-03-30 03:58:37

标签: multithreading c++11

下面的代码示例实际上可以一次执行一个1个线程。保持对线程的引用,然后调用' Thread.join'以后某个时候会产生同样的效果。如何让这些线程以这样的方式运行,程序等待线程独立并行地继续,然后退出?在我看来,必须使用其他一些内核对象信令机制。 (简而言之,使用' join'将主线程绑定到辅助线程并不让其他线程同时运行?)

int main() {
    while (cin) {
        getline(cin, input_line);
        if (input_line.length()>0)
        {
            thread t = thread(SomeLengthyCheck, input_line);
            t.join();
        }
    }
}

2 个答案:

答案 0 :(得分:1)

您通常使用线程数组,然后在for循环中等待所有这些数组。

你不在乎订单,因为最终所有订单都应该完成。

在你的情况下,你需要一个线程堆栈/队列,因为你不知道你需要等多少线程。

int main() {
    std::vector<std::thread> threads;
    std::string input_line;
    while (getline(std::cin, input_line)) {
        if (input_line.length()>0) {
            threads.push_back(std::thread(SomeLengthyCheck, input_line));
        }
    }
    for (auto& th : threads) th.join();    
}

编辑:@ o11c

建议的异常安全版本
class vthreads : std::vector<std::thread> {
    ~vthreads() { for (auto& th : *this ) th.join(); }
};

int main() {
    vthreads threads;
    std::string input_line;
    while (getline(std::cin, input_line)) {
        if (input_line.length()>0) {
            threads.push_back(std::thread(SomeLengthyCheck, input_line));
        }
    }
}

答案 1 :(得分:0)

我不是Linux的专家,但我认为线程附加到main的进程,所以当任何线程与主线程异步操作时,只需return进入主要有os关闭进程并附上所有子线程。

否则我相信当封闭的{}

之后调用函数完成时,线程将结束

当全局变量发生这种情况时,您可以向主进程发出信号。

此外,我认为你对加入感到困惑。通过停止调用线程直到要连接的线程完成,加入一个异步线程(函数)基本上同步运行。