C++ 永不更改的值的线程安全获取程序

C++ 永不更改的值的线程安全获取程序,c++,thread-safety,C++,Thread Safety,如果值从未更改,那么在没有互斥锁的情况下同时从不同线程访问类成员是否安全?值是简单指针,因此创建副本对原始值没有影响。您可以假设B类本身是线程安全的A类可以有其他成员,对它们的访问将使用互斥锁进行同步 class A { public: A() { value = new B(); } // thread safe? B* get_value() { return value; } private: B* value; //never changes } 您有一个名为fo

如果值从未更改,那么在没有互斥锁的情况下同时从不同线程访问类成员是否安全?值是简单指针,因此创建副本对原始值没有影响。您可以假设
B
类本身是线程安全的
A
类可以有其他成员,对它们的访问将使用互斥锁进行同步

class A {
public:
  A() { value = new B(); }

  // thread safe?
  B* get_value() { return value; }

private:
  B* value; //never changes

}

您有一个名为
foo
A
实例:

A foo;
调用
foo
get_value()
函数,并将结果存储在名为
bar
的变量中:

auto bar = foo.get_value();
这本身很好,但是假设用户修改了
条所指向的值

*bar = B();

存储在
条中的地址可以复制到整个程序中。现在,所有这些副本都可以在类
A
中修改
B
指向的值,无论何时何地,只要他们愿意。

真正的问题是,你能相信你的用户不会更改它吗?是的,这是安全的,您有什么特别担心为什么您认为它可能不安全吗?@OMGtechy如果用户无法更改
A
代码,可能会以某种方式破坏程序?我会在回答中为您写一个可能的场景:)完成,如果有任何不清楚的地方,请告诉我!这不会影响
foo
指针,因此不会破坏线程安全性<当然,code>B
类负责自己的线程安全,但是
A
的getter是完全可以的。这是怎么回事?您正在获取一个指向某个值的指针,该指针指向的值可能会被任何人更改?这将是引用数据(值)的更改,而不是指向存储在类中的此数据的从未更改的指针。这是我认为OP的意思。:)他说“你可以假设B类本身是线程安全的”,这意味着它的
=
操作符也可以被认为是安全的。