【发布时间】:2013-09-20 08:05:54
【问题描述】:
在 C++11 之前,局部静态变量不是线程安全的。由于某些不可重入函数的结果,我需要在性能关键函数中初始化一个静态变量。
我希望看到一个静态变量初始化,它使用互斥锁或其他同步原语,但对常规静态变量进行一些机会性检查,以减少在变量早已初始化的典型情况下使用互斥锁。似乎 GCC 为 C++11 实现了类似的东西,如 Static initialization and thread safety 中所述,但那里列出的代码并不完整,只是汇编。
注意:有很多问题询问静态变量初始化是否在 Stack Overflow 上是原子的,但他们似乎对“否”的答案感到满意,而且他们似乎没有给出实际的解决方案(如 C++ Static Initializer - Is it thread safe) .
【问题讨论】:
-
C++03 中没有可移植的解决方案,因为在 C++03 中没有线程的概念。您必须向您的操作系统寻求帮助。而且我不知道你的操作系统,所以我帮不了你。
-
@knivil 我正在寻找一种实用的解决方案,不一定是便携式解决方案(但将非便携式部分隔离起来会很方便)。假设我有一个可移植的互斥锁(这听起来很合理,因为几乎所有平台都有某种互斥锁),那么线程安全解决方案会是什么样子?
-
如果你不想提升,那么 pthread_once 用于 POSIX 和 .... (?) 用于 Windows。
-
我尝试自己编写一个基于互斥锁的实现,并很快意识到它比看起来更复杂。问题是互斥对象本身在初始化之前不能使用,它的初始化需要是线程安全的,或者在函数被调用之前完成。这可能就是 GCC 最初选择全局互斥锁的原因。我可能会检查最近的 GCC 是如何解决这个问题的(或者 boost 或 std call_once 是如何实现的)。
标签: c++ multithreading static initialization c++03