线程安全和静态函数

Thread Safety and static functions

本文关键字:静态函数 安全 线程      更新时间:2023-10-16

假设我有一个:

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已经在初始化器列表中初始化了,程序的行为就可以预测了。