考虑这个类:
#include <vector>
class A {
private:
std::vector<int> m_vector;
public:
void insertElement(int i) {
m_vector.push_back(i);
}
const std::vector<int>& getVectorRef() const {
return m_vector;
}
};
是方法getVectorRef
线程安全?
有没有可能在getVectorRef
返回的过程中另一个线程弹出并调用 insertElement
这样成员 vector 就会改变,getVectorRef
的调用者获取错误的 const 引用?
两个 const 限定符(一个用于 vector ,另一个用于方法)在线程安全上下文中没有意义吗?
最佳答案
成员函数是线程安全的,而您的接口(interface)不是。在设计为线程安全的类中,您不能对您维护的对象产生引用,就好像用户保留引用一样,她可以在其他操作就位时使用它。
成员函数在技术上是线程安全的。对成员的引用基本上是它的地址,该地址不能更改。无论其他线程在做什么,引用总是指向完全相同的对象。但这通常不是您主要关心的问题。真正关心的是用户可以用函数的返回做什么,在这种情况下,答案基本上是没有。
一旦用户获得引用,通过它进行的任何访问与原始对象中该成员的任何修改相结合都会导致竞争条件。一旦放弃引用,就无法提供安全同步,无法从产生引用的类中创建线程安全接口(interface)。
如果您需要使访问线程安全,您可以选择复制值(在关键部分内)或提供更细粒度的函数来处理来自用户的更高级别的请求。
我推荐 Anthony Williams 撰写的 C++ 并发实战,以讨论如何使接口(interface)线程安全。
关于c++ - const 方法的 const 引用返回的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19095317/