6

假设我有一个:

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

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

    int d;
};

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

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

我的分析正确吗?有什么我需要注意的吗?

4

1 回答 1

8

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

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

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

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

于 2012-12-28T05:22:48.450 回答