Однократный вызов std::call_once в C++
Ровно один запуск гарантирует std::call_once,
даже если его дергают параллельно с общим
std::once_flag.
Два потока попробуют напечатать слово, но сработает только первый успешный проход:
#include <iostream>
#include <mutex>
#include <thread>
int main() {
std::once_flag flag;
auto print_once = []() {
std::cout << "once\n";
};
std::thread a([&]() { std::call_once(flag, print_once); });
std::thread b([&]() { std::call_once(flag, print_once); });
a.join();
b.join();
return 0;
}
Два потока вызывают std::call_once с общим std::once_flag. Внутри выведите "init" один раз.