我的不同线程是否会看到更新后的shared_ptr对象

Does my different threads will see the updated shared_ptr object

本文关键字:shared 对象 ptr 更新 线程 是否 我的      更新时间:2023-10-16

我有多个线程从多个共享对象中读取。这些对象中的每一个都包含指向一个点的shared_ptr:

struct Point
{
int x;
int y;
}
shared_ptr<Point> dataPtr=std::make_shared<Point>(Point(...init...)); // at compile time

然后我将它传递给我的不同对象的复制构造函数

Object1 obj1 = Object1(..., dataPtr, ...)
Object2 obj2 = Object2(... , dataPtr, ...)

在某个时刻,我将通过以下操作更新基本点:

dataPtr.get().x=newvalue;

我不必考虑任何种族场景,读者在写新的价值观之前都会睡着。然而,我想和你核实一下,所有线程在更新后都会看到newvalue,这不是一种"缓存而看不到更新"的情况。

Thks

是的,所有线程都将看到来自cppreference:的新值

所有成员函数(包括复制构造函数和复制赋值)可以由shared_ptr的不同实例上的多个线程调用即使这些实例是副本,也不需要额外的同步并共享同一对象的所有权。

但是您不必使用get()来访问存储的指针,这是更好的样式:

dataPtr->x = newvalue;