屏障¶
- 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