跳转至

闩锁

和 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