我已经解决了关于何时使用 call_once
和
this关于静态初始化的线程安全性的问题。看来,如果本地可调用对象是静态初始化的,那么它的作用几乎相同。在选择其中之一时应考虑哪些细微差别/设计考虑因素?这是我遇到的具体用例,我们只想记录一次(完整编译示例)。
void fooCallOnceVersion() {
static std::once_flag once;
std::call_once(once, []() {
std::printf("Foo call once\n");
});
}
void fooStaticVersion() {
static auto printLog = []() {
return std::printf("Foo static version\n");
}();
}
fooStaticVersion
中,你必须发明一个要存储的值。当
std::once_flag
被正确记录时,这可以被视为黑客攻击。在你有限的例子中,我不知道除此之外还有什么重要的区别。但是,std::once_flag
可以存储在其他地方,并允许对
std::call_once
进行多次不同的调用。例如:class foo {
std::once_flag flag;
void bar1(auto&& f) { std::call_once(flag,f); }
void bar2(auto&& f) { std::call_once(flag,f); }
}
您无法轻松地使用
static
变量进行模拟,因为它对于所有实例都是相同的。