C++ 测试静态本地对象的初始化是否是线程安全的

C++ 测试静态本地对象的初始化是否是线程安全的,c++,multithreading,c++11,initialization,C++,Multithreading,C++11,Initialization,我试图编写一个测试(不检查汇编代码),看看某个编译器是否符合c++11标准中关于静态本地对象初始化的线程安全要求 到目前为止,我只能提出非确定性的方法(在一个线程上睡眠足够长的时间,以使另一个线程有可能(但不一定是问题!)运行到某个执行点) 有没有一种方法可以决定性地做到这一点?例如,像这样的同步伏都教(见注释): #include <thread> #include <mutex> #include <chrono> #include <iostrea

我试图编写一个测试(不检查汇编代码),看看某个编译器是否符合c++11标准中关于静态本地对象初始化的线程安全要求

到目前为止,我只能提出非确定性的方法(在一个线程上睡眠足够长的时间,以使另一个线程有可能(但不一定是问题!)运行到某个执行点)

有没有一种方法可以决定性地做到这一点?

例如,像这样的同步伏都教(见注释):

#include <thread>
#include <mutex>
#include <chrono>
#include <iostream>

std::mutex g_mutex;

const std::chrono::seconds g_dura(1);

void log(const char* msg) {
    std::clog << std::this_thread::get_id() 
              << " "  << msg 
              << std::endl;
}

struct Asset {
    Asset () {
        log("before lock attempt");
        g_mutex.lock();
        log("after lock attempt");
        /*EDIT*/g_mutex.unlock();
    }
};

void test() {
    log("entering test()");
    static Asset asset; 
    log("leaving test()");
}

int main() {
    g_mutex.lock();
    std::thread t1(test), t2(test);
    std::this_thread::sleep_for(g_dura);

    // cleanup
    g_mutex.unlock();
    t1.join();
    t2.join();
}
#包括
#包括
#包括
#包括
std::mutex g_mutex;
常数std::chrono::秒g_dura(1);
无效日志(常量字符*msg){

std::clog No.我想你也希望用任意类型的对象进行测试,例如豆荚。因为否则你可以在自定义ctor中尝试一些同步巫毒。@Solkar你能详细介绍一下“同步巫毒”吗请?我可以使用自定义的ctor。@Mankarse如果你能给我指出MSVC12、GCC4.9、clang3.5菜单,请这样做。@nos有趣的阅读,谢谢。不确定这是否可靠。它在MSVC11上给出了“正确”的输出(即,一对锁尝试消息),它不实现神奇的静态。也只有一个“在尝试锁之前”消息?我最初忘记解锁互斥锁(设置为/*EDIT*/)是的。我得到了
t1-进入
t1-尝试前
t2-进入
t2-离开
t1-尝试后
t1-离开
。似乎第二个线程执行函数,即使对象还没有完全构造。好的一点。让我们尝试实际使用该对象吧!很可能msvc只是优化了第二次调用。我只是想知道:为什么使用
std::clog
?(而不是
std::cout
std::cerr