假设我有一个:
class base
{
base(){f(this);};
static void f(base * b) {(b->d)++;};
int d;
};
现在,如果在2个单独的线程上创建一个base类型的对象,方法f
会被认为是线程安全的吗?
我问这个问题,因为通常从我所知道的是,对于一个线程安全的方法,它不应该使用静态成员或全局变量。但正如您从上面的示例中看到的那样,我决定不将变量d
设为静态,而是通过运行的base实例调用它。
另外,我认为我不需要保护这一行:(b->d)++;
使用互斥锁,因为每个线程都有一个单独的base和变量d的实例。
我的分析是否正确?有什么我应该小心的吗?
答案 0 :(得分:8)
是的,您的构造函数是线程安全的,因为它只访问实例变量(特别是d
)。它确实表现出未定义的行为,因为它从未初始化的d
读取以执行增量,但这与线程安全无关。
以下是修复未定义行为的方法:
base(): d(0) {f(this);};
现在d
已在初始化列表中初始化,您的程序以可预测的方式运行。