Clang 到现在都不支持`atomic<shared_ptr<T>>`,只能继续 `atomic_load()` 和 `atomic_store()`。一旦要用 `weak_ptr` 则如同残废,不支持`atomic_load()`和 `atomic_store()`。

GCC 12.2 及旧版本有“bug”( P0718R2 的疏忽),刚好 Debian 12 自带的 GCC 就是 12.2 ,直接完蛋。

这段代码在 Debian 12 (bookworm)无法编译,换成 Debian Testing (trixie)就可以成功编译:

```
#include <atomic>
#include <memory>

class A{ int a; };

int main()
{
    std::atomic<std::shared_ptr<A>> a_ptr = std::make_shared<A>();
    a_ptr = nullptr;

    return 0;
}
```

想要写跨编译器的代码很麻烦,只能加好几行`#if #else #endif`

Clang 原本已经有人在实现`atomic<shared_ptr<T>>`,准备到一半就放弃了:<br />
[[libc++] Implement P0718R2: atomic<shared_ptr<T>>]( https://github.com/llvm/llvm-project/pull/78317) <br />
放弃的原因令人无语,因为 PR 内`wait`/`notify_all`的效率不太高,需要重写,作者直接不干了
举报· 54 次点击
登录 注册 站外分享
2 条回复  
Coelacanthus 初学 2024-10-20 18:30:15
GCC 12 分支最新的 fix 版本是 12.4 啊,Debian 他们居然没更新。你可以给他们提个 request 要求更新,理由就是有已知 bug 。
felixlong 小成 2024-10-20 18:59:32
把 shared_ptr 放到 atomic 里面的使用场景是什么?
返回顶部