对本地对象的静态初始化进行call_once

问题描述 投票:0回答:1

我已经解决了关于何时使用 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"); }(); }


c++ concurrency static-initialization
1个回答
2
投票
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

变量进行模拟,因为它对于所有实例都是相同的。

    

© www.soinside.com 2019 - 2024. All rights reserved.