Hos*_*ork 8 c++ thread-safety language-lawyer c++11
C++ 11提供了静态变量的线程安全初始化等功能,并引用了我们会说的问题:
Logger& g_logger() {
static Logger lg;
return lg;
}
Run Code Online (Sandbox Code Playgroud)
所以表面上(?)无论用C++ 11编译器编译的模块是否包含线程头,或者在其体内产生了任何线程,都是如此.即使它与另一个使用C++ 11线程并调用该函数的模块相关联,也可以获得保证.
但是,如果调用此代码的"其他模块"不使用C++ 11线程,而是像Qt那样QThread
.静态的原子初始化是否超出了C++ 11的范围,能够做出这样的保证?或者仅使用C++ 11编译模块然后与其他C++ 11代码链接的事实意味着您将获得保证,无论如何?
有没有人知道这样的问题的好参考?
有没有人知道这样的问题的好参考?
当然.C++标准.它描述了C++代码的行为.如果您的库是C++代码,则需要遵循此行为.所以,是的,你得到的保证就好像它是你自己的代码一样.
编译器/运行时/操作系统/其他所有内容如何将其拉下来并不是你的问题.C++标准保证它得到妥善处理.
您的示例依赖于内存模型,而不依赖于线程的实现方式。无论谁执行这段代码,都会执行相同的指令。如果两个或更多内核执行此代码,它们将遵守内存模型。
基本实现相当于这样:
std::mutex mtx;
Logger * lg = 0;
Logger& g_logger() {
std::unique_lock<std::mutex> lck(mtx);
if (lg == 0)
lg = new Logger;
return *lg;
}
Run Code Online (Sandbox Code Playgroud)
该代码可以被优化以使用双重检查锁定模式(DCLP),其在特定处理器架构(例如,在x86上)上可能快得多。另外,因为编译器生成此代码,所以它知道不要进行疯狂的优化来破坏幼稚的 DCLP。
归档时间: |
|
查看次数: |
853 次 |
最近记录: |