【发布时间】:2016-02-24 09:35:29
【问题描述】:
假设我在构造函数中初始化了一个成员变量向量,并且该向量在其他几个成员函数中被读取(不写入其他任何地方)。我是否需要保护对向量的访问(包括在构造函数中),还是保证对象在用于其他线程之前将被完全初始化并刷新到主内存?
让我举个例子:
class A
{
public:
A();
void f1();
void f2();
private:
std::vector<int> v;
};
A::A()
{
// do some setup work in v
v.push_back(1);
}
// called from thread1
void A::f1()
{
// some readonly work on v
for (auto i : v) {
// do something on i
}
}
// called from thread2
void A::f2()
{
// more readonly work on v
if (v.empty()) {
// do other work
}
}
我需要在A::A()、A::f1() 和A::f2() 中锁定保护 v 吗?
【问题讨论】:
-
成员在进入构造函数体之前被初始化,因此肯定在对象本身被构造之前。
-
最重要的部分是:您如何将对象的引用传递给另一个线程。如果该机制建立了“发生在之前”的关系,那么您是安全的。如果没有,则无论您在构造函数中做什么
标签: c++ multithreading c++11 thread-safety