Assume that I have code like:
void InitializeComplexClass(ComplexClass* c);
class Foo {
public:
Foo() {
i = 0;
InitializeComplexClass(&c);
}
private:
ComplexClass c;
int i;
};
如果我现在做类似于
Foo f;
的操作,并将指向f
的指针交给另一个线程,那么我有什么保证可以确保InitializeComplexClass()
所做的任何存储都对访问f
的其他线程的CPU可见?写入i
的零的存储呢?我是否需要在类中添加互斥锁,在构造函数中获取写入锁,并在访问成员的任何方法中获取相应的读取锁?更新:假设一旦构造函数返回,我会将指针交给一堆其他线程。我并不假设代码运行在x86上,而是可能在像PowerPC这样具有进行内存重排序的自由的东西上运行。我感兴趣的实质上是编译器在构造函数返回时必须注入哪些类型的内存屏障。
Foo
被初始化一次,然后被多个线程读取,我建议将const
指针传递给其他线程。C++并没有真正的深度或传递性const
,但是如果您确保其他线程无法改变成员,您就可以避免锁定。 - Tomek SowińskiComplexClass
中的非原子更改。 - user4581301