std :: thread:如何等待(join)任何给定的线程完成?

t12*_*3yh 8 c++ multithreading c++11

例如,我有两个线程,t1t2.我想等待t1 t2完成.这可能吗?

如果我有一系列线程,比如说,a std::vector<std::thread>,我该怎么做?

Snp*_*nps 7

总是有等待和通知使用std::condition_variable例如

std::mutex m;
std::condition_variable cond;
std::atomic<std::thread::id> val;

auto task = [&] {
    std::this_thread::sleep_for(1s); // Some work

    val = std::this_thread::get_id();
    cond.notify_all();
};

std::thread{task}.detach();
std::thread{task}.detach();
std::thread{task}.detach();

std::unique_lock<std::mutex> lock{m};
cond.wait(lock, [&] { return val != std::thread::id{}; });

std::cout << "Thread " << val << " finished first" << std::endl;
Run Code Online (Sandbox Code Playgroud)

注意: val不一定代表最先完成的线程,因为所有线程几乎同时完成并且可能会发生覆盖,但这仅用于本示例。

  • 但是请注意,分离线程是 **设计** 决定,而不是编码方便,并且很少是合适的。在这种情况下,它是不需要的。一旦主线程唤醒,它就可以加入三个线程。 (3认同)