std::once_flag 是 C++11 标准库中的一个类,它用于确保某个函数或代码块只执行一次。它经常与线程回调 std::call_once 配合使用,以实现线程安全的一次性初始化。
简单地说,std::once_flag 是一个标志,当你用 std::call_once 函数和一个 std::once_flag 对象初始化时,它会确保某个函数或代码块只被执行一次。
以下是一个简单的例子来展示如何使用 std::once_flag 和 std::call_once:
#include <iostream>
#include <thread>
#include <mutex>
std::once_flag flag;
void print_id() {
static int id = 0;
++id;
std::cout << "Thread ID: " << std::this_thread::get_id() << ", Value: " << id << std::endl;
}
int main() {
std::call_once(flag, print_id); // 确保 print_id 只被执行一次
std::thread t1(print_id);
std::thread t2(print_id);
t1.join();
t2.join();
return 0;
}
在这个例子中,尽管我们创建了两个线程并尝试多次调用 print_id 函数,但由于使用了 std::call_once 和 std::once_flag,该函数只会被执行一次。