闩锁¶
和 barrier 相比 latch 为 单次使用的屏障,不可重复使用。
1 方法¶
count_down
:以不阻塞的方式减少计数器try_wait
:测试内部计数器是否等于零wait
:阻塞直至计数器抵达零arrive_and_wait
:减少计数器并阻塞直至它抵达零
2 示例¶
#include <functional>
#include <iostream>
#include <latch>
#include <string>
#include <thread>
int main() {
struct job {
const std::string name;
std::string product{"not worked"};
std::thread action{};
} jobs[] = {{"annika"}, {"buru"}, {"chuck"}};
std::latch work_done{std::size(jobs)};
std::latch start_clean_up{1};
auto work = [&](job& my_job) {
my_job.product = my_job.name + " worked";
work_done.count_down();
start_clean_up.wait();
my_job.product = my_job.name + " cleaned";
};
std::cout << "Work starting... ";
for (auto& job : jobs) {
job.action = std::thread{work, std::ref(job)};
}
work_done.wait();
std::cout << "done:\n";
for (auto const& job : jobs) {
std::cout << " " << job.product << '\n';
}
std::cout << "Workers cleaning up... ";
start_clean_up.count_down();
for (auto& job : jobs) {
job.action.join();
}
std::cout << "done:\n";
for (auto const& job : jobs) {
std::cout << " " << job.product << '\n';
}
}
输出:
Work starting... done:
annika worked
buru worked
chuck worked
Workers cleaning up... done:
annika cleaned
buru cleaned
chuck cleaned