测试静态局部对象的初始化是否线程安全
Testing if the initialization of static local objects is thread-safe
我想写一个测试(不检查汇编代码),看看某个编译器是否符合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();
}
这使得必须执行init的第一个线程(不一定是t1)在actor中等待,并且期望的行为是,第二个线程(不一定是t1)在挂起的静态变量init(在第一个线程中)完成之前等待。
因此,如果编译器工作正常,只会打印出一对对"before lock attempt"/"after lock attempt"消息。
g++ (Debian 4.8.2-16)表现良好。
如果t1、t2本身管理主线程的控制流,则voodoo可以放在首位;我跳过了它,只是设置了一个计时器。相关文章:
- 如何检查线程是否锁定
- MESI协议和std::atomic-它是否确保所有写入立即对其他线程可见?
- 在 openmp 中,omp_get_thread_num是否绑定到物理线程?
- 并发/多线程:是否可以以这种方式生成相同的输出?
- 我是否生成线程并导致内存泄漏?
- 虚假唤醒是否会解锁所有等待线程,甚至是不相关的线程?
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 是否可以创建一个从不同类调用函数的线程?
- 是否有必要获取锁并在不需要唤醒线程时通知condition_variable?
- C++:在多个线程中访问同一数组/向量的不同单元格是否会产生数据竞赛?
- 线程调用的函数对对象删除是否安全?
- 在不同的内存位置同时写入 std::d eque 是否线程安全?
- 在 OpenCV 中访问具有多个线程的 Mat 是否线程安全?
- 在 C++20 中获取当前日期/时间是否线程安全?
- 在 c++ 的多个线程中编写 c 数组的不同项是否线程安全
- 当结构数组在主线程中填充数据时,从结构数组的低索引元素读取是否线程安全
- boost套接字读写功能是否线程安全
- 对磁盘的openmp写入是否线程安全
- 测试静态局部对象的初始化是否线程安全
- Boost ptime是否线程安全