gpt4 book ai didi

c++ - 将指针传递给 shared_ptr 线程安全

转载 作者:搜寻专家 更新时间:2023-10-31 02:07:58 28 4
gpt4 key购买 nike

// Example program
#include <iostream>
#include <string>
#include <memory>
#include <atomic>

struct Smth {};

struct B { //Used in thread 2
B(std::shared_ptr<Smth>* smth) : smth_(smth) {};
~B();
void DoSomething() {
std::shared_ptr<Smth> newSmth = std::make_shared<Smth>();
smth_->swap(newSmth);
}
std::shared_ptr<Smth>* smth_;
};

struct A { //Used in thread 1&3
A() : smth_(std::make_shared<Smth>()), b_(&smth_) {};
~A();
std::shared_ptr<Smth> smth_;
B b_;
};

那么将指针传递给 shared_ptr 以便我可以在单独的线程中交换 shared_ptr 的内容是不是一种好习惯?第二个问题是我应该使用 std::atomic_store 来替换 shared_ptr::swap,如果是的话我应该怎么做?

最佳答案

我对您如何最终选择这种设计感到困惑...我希望它在您的实际项目中有意义。

您应该将指针(或最好是引用)传递给 shared_ptr唯一原因是重新安装它(就像您正在做的那样)并且您不这样做不需要同步 swap 本身(shared_ptr 已经同步)。

但是,交换内容会导致与当时正在使用该对象(读取或写入)的其他线程发生同步问题。因此,如果两个线程都在修改对象,您将需要应用相同的同步技术。

无论您的实际问题是什么,我都觉得这不是一个可靠的解决方案。或许可以考虑将新的 std::shared_ptr 传递给另一个线程,然后向其发送信号,以便它知道获取新的共享指针(通过复制而非指针)。

关于c++ - 将指针传递给 shared_ptr 线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48082774/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com