【发布时间】:2012-03-07 20:03:29
【问题描述】:
C++11 提供了像thread-safe initialization of static variables 这样的特性,并引用这个问题我们会说例如:
Logger& g_logger() {
static Logger lg;
return lg;
}
所以表面上(?)这是真的,无论使用 C++11 编译器编译的模块是否包含线程头,或者在其主体中产生任何线程。即使它链接到另一个使用 C++11 线程并调用该函数的模块,您也可以获得保证。
但是,如果您调用此代码的“其他模块”不是使用 C++11 线程,而是使用 Qt 的QThread 之类的东西怎么办。那么静态的原子初始化是否超出了 C++11 做出这种保证的能力范围?或者,一个模块已经用 C++11 编译然后链接到其他 C++11 代码这一事实是否意味着无论如何你都会得到保证?
有没有人知道涵盖此类问题的良好参考资料?
【问题讨论】:
-
静态初始化是一种语言属性。我看不出这会如何受到特定库的影响。
-
@pmr 这对我来说似乎有点棘手,因为 - 例如 - 上述静态的内存是在程序开始时分配的,但是构造函数第一次运行函数时使用它内部的静态被调用。要实现这一点,似乎需要对底层线程模型的全知,所以我怀疑如果混合 QThread/C++11thread 是否能正确... .
-
@HostileFork:只要(c++ 和 qt)都使用相同的操作系统工具进行线程处理,我看不出有什么地方会出错。我也不明白为什么两者都不应该使用操作系统线程工具。
-
虽然底层线程模型是已知的。 QThreads 只是一个包装器。它们在 C++ 库中实现,因此它们的行为就像 C++ 所说的线程应该行为。 C++ 标准描述了“执行线程”。它并不是说必须将它们创建为
std::thread对象。 pthread、Boost.Thread 和 QThread 都是根据 C++11 执行的有效线程
标签: c++ thread-safety c++11 language-lawyer