是否有任何C++ 11线程安全保证适用于使用C++ 11编译/链接的第三方线程库?

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代码链接的事实意味着您将获得保证,无论如何?

有没有人知道这样的问题的好参考?

jal*_*alf 7

有没有人知道这样的问题的好参考?

当然.C++标准.它描述了C++代码的行为.如果您的库是C++代码,则需要遵循此行为.所以,是的,你得到的保证就好像它是你自己的代码一样.

编译器/运行时/操作系统/其他所有内容如何将其拉下来并不是你的问题.C++标准保证它得到妥善处理.


Bar*_*ski 4

您的示例依赖于内存模型,而不依赖于线程的实现方式。无论谁执行这段代码,都会执行相同的指令。如果两个或更多内核执行此代码,它们将遵守内存模型。

基本实现相当于这样:

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。