gpt4 book ai didi

c++ - 线程安全和静态函数

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:24:45 25 4
gpt4 key购买 nike

假设我有一个:

class base
{
base(){f(this);};

static void f(base * b) {(b->d)++;};

int d;
};

现在,如果我在 2 个单独的线程上创建一个 base 类型的对象,方法 f 会被认为是线程安全的吗?我问这个问题是因为通常据我所知,对于线程安全的方法,它不应该使用静态成员或全局变量。但是正如您从上面的示例中看到的那样,我决定不将变量 d 设为静态,而是通过 base 的运行实例调用它。

此外,我认为我不需要用互斥锁保护这一行:(b->d)++;,因为每个线程都有一个单独的 base 和变量 d 实例.

我的分析是否正确?有什么需要注意的地方吗?

最佳答案

是的,你的构造函数是线程安全的,因为它只访问实例变量(具体来说,d)。它确实表现出未定义的行为,因为它从未初始化的 d 读取以执行增量,但这与线程安全无关。

以下是修复未定义行为的方法:

base(): d(0) {f(this);};

现在 d 已在初始化列表中初始化,您的程序将以可预测的方式运行。

关于c++ - 线程安全和静态函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14064914/

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