std::once_flag
和 std::call_once
是 C++11 标准库 <mutex>
头文件中提供的用于实现线程安全的“仅执行一次”操作的工具。
std::once_flag
是一个标志对象,用于保证一个函数只被执行一次。在多线程环境下,通常会将 std::once_flag
对象作为静态局部变量或全局变量,用于跟踪函数是否已经被执行过。
std::call_once
函数用于调用只需执行一次的操作,它接受一个 std::once_flag
对象、一个回调函数以及传递给回调函数的参数。std::call_once
会保证回调函数只被执行一次,即使在多线程环境下也不会重复执行。
#include <iostream>
#include <thread>
#include <mutex>
std::once_flag flag;
void initialize_resource() {
std::cout << "初始化资源" << std::endl;
// 这里可以初始化资源,确保只被执行一次
}
void use_resource() {
std::call_once(flag, initialize_resource);
// 其他线程调用 use_resource() 时,initialize_resource() 只会执行一次
std::cout << "使用资源" << std::endl;
}
int main() {
std::thread t1(use_resource);
std::thread t2(use_resource);
t1.join();
t2.join();
return 0;
}
在这个示例中,std::call_once
保证了 initialize_resource()
函数只被执行一次,即使在多线程环境下多次调用 use_resource()
函数。这可以防止资源被多次初始化或其他仅需执行一次的操作被重复执行。
Comments NOTHING