gpt4 book ai didi

c++ - 函数中初始化局部变量和运行语句的顺序是什么(+内存顺序)?

转载 作者:行者123 更新时间:2023-11-30 05:35:05 25 4
gpt4 key购买 nike

对于下面的代码,Lock对象是在第一条语句之后还是之前初始化?

int* data = NULL;
int* example() {
if (data) return data;

Lock lock;
data = new int[10];
return data;
}

我知道它应该以这种方式按预期工作:

int* data = NULL;
int* example() {
if (data) return data;

{
Lock lock;
if (!data)
data = new int[10];
}
return data;
}

但是上面的两种方法都可以在弱内存顺序机器上的多线程中工作吗?我尝试搜索但找不到答案。

最佳答案

局部变量在执行通过它们的定义点时被初始化。也就是说,您第一次执行 example()等同于(这甚至是双重检查锁定的不正确使用 - 除了具有数据竞争之外,它还省略了第二次检查...):

int* example() {
if (data)
return data;

{
Lock lock; // (this really needs to reference some already initialized mutex
data = new int[10];
return data;
}
}

假设您的 Lock类获取一个适当初始化的互斥锁,根据 C++ 标准,代码仍然存在数据竞争:阅读 dataif -声明和return -语句与设置不同步 data之后。因此,根据 C++ 标准,所有这些函数都会导致未定义的行为。避免所有问题的一个简单修复是依赖于初始化函数局部的保证 static变量:

int* example() {
static int* rc = new int[10];
return rc;
}

rc的初始化必须以线程安全的方式完成。如果多个线程尝试初始化 rc同时,只有一个线程会设法做到这一点,而所有其他线程都被阻塞,直到初始化完成。

关于c++ - 函数中初始化局部变量和运行语句的顺序是什么(+内存顺序)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33987128/

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