静态成员函数和线程安全性

Ton*_*ion 18 c++ static multithreading member-functions

在静态成员函数中创建的对象和变量不像在成员函数中那样被视为"本地",因此它们现在可以在多个线程之间共享吗?

如果你有一个创建某个对象的成员函数,那么这将是线程的本地函数,因此它是非共享的.

我说的是对的吗?

Mic*_*l J 41

考虑这个课程

class CData
{
public:
    static void func()
    {
        int a;
        static int b;
    }

    int c;
    static int d;
};

int main()
{
    CData::func();
}
Run Code Online (Sandbox Code Playgroud)

现在变量a是每次调用的本地变量func().如果两个线程同时调用func(),它们会得到不同的版本a.

b是一个静态的本地.不同的调用之间的值仍然存在func().如果两个线程同时调用func(),则它们访问相同版本,b因此可能需要进行同步.

c是一个实例变量; 它附加到CData的特定实例. func()无法访问c,除了我将在下面显示的技巧.

d是一个静态变量.在dCData类的所有使用之间共享一个实例,因此可能需要同步.它可以很容易地从静态功能中使用func().

用于从静态函数访问实例数据的技巧是将有效对象传递给函数.

例如

class CData
{
public:
    static void func(CData *p)
    {
        int a;
        static int b;

        b = p->c;
    }

    int c;
    static int d;
};

int main()
{
    CData data;
    CData::func(&data);
}
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.

  • 很好的解释伙计! (4认同)
  • 这是迄今为止我见过的最好的解释.谢谢.帮了我很多忙! (2认同)

Ste*_*and 20

不,你不对.

在静态函数创建的对象不是共享的,任何普通函数也是如此.

如果对象本身被声明为静态,则可以共享对象,并且它不依赖于函数是否为静态.

void myFunc()
{
    static MyObject o;
    o.CallMethod(); // here o is shared by all threads calling myFunc
}
Run Code Online (Sandbox Code Playgroud)

当一个对象被声明为static时,就好像该对象是一个全局变量,但只能在声明它的函数范围内可见.