C++ 共享ptr交换线程安全吗?
下面是一些代码片段C++ 共享ptr交换线程安全吗?,c++,multithreading,shared-ptr,swap,C++,Multithreading,Shared Ptr,Swap,下面是一些代码片段 std::shared_ptr<int> global(new int(1)); void swapper(int x) { std::shared_ptr<int> sp(new int(x)); global.swap(sp); } std::shared_ptr global(新int(1)); 无效交换程序(int x) { 标准::共享的ptr sp(新的int(x)); 全球互换(sp); } 假设我想在并行
std::shared_ptr<int> global(new int(1));
void swapper(int x)
{
std::shared_ptr<int> sp(new int(x));
global.swap(sp);
}
std::shared_ptr global(新int(1));
无效交换程序(int x)
{
标准::共享的ptr sp(新的int(x));
全球互换(sp);
}
假设我想在并行线程中调用swapper
。那是线程安全的吗
我知道这一点。它显示了如果我将值重新分配给global
,那么分配指针是如何不保证线程安全的
我的问题是swap
成员函数本身是否是线程安全的
一方面,shared_ptr的控制块功能是线程安全的。
另一方面,我假设我正在切换指向控制块的指针,因此它不应该是线程安全的
那里有什么联系?
swap
是线程安全的吗?否,swap
不是线程安全的,但还有另一个功能:
atomic_store(&global, sp);
还有一个
atomic_exchange
,如果需要,它会返回旧值。如果不寻址swap
,这个函数应该看起来像global.reset(new int(x))
@Barry:如果您希望它是线程安全的,它就不会。?但是我们要处理的是一个共享的\u ptr
@Barry:不,。那就更有意义了!发布了一条谚语“请注意,自C++20以来,std::shared_ptr不推荐使用atomic_axchange:”