螺纹安全和静态功能

时间:2012-12-28 05:16:22

标签: c++ multithreading

假设我有一个:

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

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

    int d;
};

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

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

我的分析是否正确?有什么我应该小心的吗?

1 个答案:

答案 0 :(得分:8)

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

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

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

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