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:”