跳转至

屏障

  • std::barrier - cppreference.com
  • 功能:std::barrier 提供允许至多为 期待数量的线程阻塞直至期待数量的线程到达该屏障。(比如一个任务分 3 个线程去处理,我需要这 3 个线程都执行到该屏障,才继续往下执行)。不同于 std::latch ,屏障可重用:一旦到达的线程从屏障阶段的同步点解除阻塞,则可重用同一屏障。(当 3 个线程到达屏障点后,执行屏障后内容,如果再次使用屏障,同样需要满足 3 个线程都执行到新的屏障点。)

1 示例

#include <barrier>
#include <iostream>
#include <string>
#include <thread>
#include <vector>

int main() {
  const auto workers = { "anil", "busara", "carl" };

  auto on_completion = []() noexcept { 
    // locking not needed here
    static auto phase = "... done\n" "Cleaning up...\n";
    std::cout << phase;
    phase = "... done\n";
  };
  std::barrier sync_point(std::ssize(workers), on_completion);

  auto work = [&](std::string name) {
    std::string product = "  " + name + " worked\n";
    std::cout << product;  // ok, op<< call is atomic
    sync_point.arrive_and_wait();

    product = "  " + name + " cleaned\n";
    std::cout << product;
    sync_point.arrive_and_wait();
  };

  std::cout << "Starting...\n";
  std::vector<std::thread> threads;
  for (auto const& worker : workers) {
    threads.emplace_back(work, worker);
  }
  for (auto& thread : threads) {
    thread.join();
  }
}

可能的输出:

Starting...
  anil worked
  carl worked
  busara worked
... done
Cleaning up...
  busara cleaned
  carl cleaned
  anil cleaned
... done