【发布时间】:2017-10-05 20:53:05
【问题描述】:
从 C++11 开始,静态变量初始化保证是线程安全的。但是如何在多个线程中修改静态变量呢?如下所示
static int initialized = 0;
Initialize()
{
if (initialized)
return;
initialized = 1; // Is this thread safe?
}
我问这个问题的原因是我正在阅读源代码
Py_Initialize(),我正在尝试将 Python 嵌入到多线程 C++ 应用程序中,我想知道在多个线程中多次调用 Py_Initialize() 是否安全? Py_Initialize() 的实现归结为
函数_Py_InitializeEx_Private,如下所示
// pylifecycle.c
static int initialized = 0;
_Py_InitializeEx_Private(int install_sigs, int install_importlib)
{
if (initialized)
return;
initialized = 1;
// a bunch of other stuff
}
C 的结论是否与 C++ 相同?
编辑 所以所有的答案都很好,我选择了最让我头脑清醒的一个。
【问题讨论】:
-
不允许两个线程不同步修改同一个内存位置。
-
好吧,错误..他们是被允许的!您必须了解可能的结果以及这可能会如何影响您应用的功能。
-
@ThingyWotsit,你能说清楚什么是允许的吗?
-
@Allanqunzi 他的意思是允许不同步的读取和写入,但您必须准备好处理可能对程序状态产生的影响。例如,将 64 位整数写入内存通常不是 32 位架构上的原子操作,这意味着如果您不采取措施,可能会得到一个值的上半部分和另一个值的下半部分同步读取和写入。
-
@Allanqunzi 如果您连续多次访问同一个静态变量,则允许编译器将这些访问优化为单个操作,假设值为 not i> 将被另一个线程同时修改。这就是
std::atomic和volatile(对后者的作用有正确理解)之类的东西可能有用的地方。
标签: python c++ c multithreading c++11