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
是一个静态变量.在d
CData类的所有使用之间共享一个实例,因此可能需要同步.它可以很容易地从静态功能中使用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)
希望有所帮助.
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时,就好像该对象是一个全局变量,但只能在声明它的函数范围内可见.