螺纹安全和静态功能

Kam*_*Kam 6 c++ multithreading

我想我有一个:

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

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

    int d;
};
Run Code Online (Sandbox Code Playgroud)

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

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

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

das*_*ght 8

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

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

base(): d(0) {f(this);};
Run Code Online (Sandbox Code Playgroud)

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