gpt4 book ai didi

c++ - 测试静态局部对象的初始化是否线程安全

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:22:59 25 4
gpt4 key购买 nike

我正在尝试编写一个测试(不检查汇编代码)来查看某个编译器是否符合 c++11 标准关于静态局部对象初始化的线程安全要求。

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

有没有办法确定性地做到这一点?

最佳答案

例如像这样的 sync voodoo(见评论):

#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();
}

这让必须执行初始化的第一个线程(不一定是 t1)在 ctor 中等待,而期望的行为是,第二个(不一定是 t1)线程在 挂起的静态变量初始化(在第一个线程中)完成。

因此,如果编译器工作正常,则只会打印一对“尝试锁定前”/“尝试锁定后”消息。

g++ (Debian 4.8.2-16) 表现良好。

如果 t1、t2 自己管理主线程的控制流,那么 voodoo 可以放在顶部;我跳过了它,只是设置了一个计时器。

关于c++ - 测试静态局部对象的初始化是否线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24474773/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com