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>>
,准备到一半就放弃了:
[libc++] Implement P0718R2: atomic<shared_ptr<T>>
放弃的原因令人无语,因为 PR 内wait
/notify_all
的效率不太高,需要重写,作者直接不干了
1
Coelacanthus 14 小时 53 分钟前
GCC 12 分支最新的 fix 版本是 12.4 啊,Debian 他们居然没更新。你可以给他们提个 request 要求更新,理由就是有已知 bug 。
|
2
felixlong 14 小时 24 分钟前
把 shared_ptr 放到 atomic 里面的使用场景是什么?
|
3
cnbatch OP @Coelacanthus 刚用 reportbug 命令向 Debian 提交了,暂时还没什么反应,就连编号都还没生成。
不太熟悉他们的流程,看来只能继续等待 |
4
cnbatch OP @felixlong 多线程读写会用到,放进 atomic 就不需要再用 mutex 了。
举个例子,atomic<shared_ptr<Description>>,用来保存一段文字描述,修改时直接 make_shared<Description>,其他线程读取时调用 load() 成员函数或者用 std::atomic_load(),可以确保修改与读取互不干扰。对于时间敏感度不高的场景会很方便,起码不会死锁。 |
5
flax5a98aa2 10 小时 0 分钟前
|
6
flax5a98aa2 9 小时 56 分钟前
[Lock-free Atomic Shared Pointers Without a Split Reference Count? It Can Be Done!]( ) 还有这个,我以前看没看懂,看到这个帖子想起来了,不知道是否对你有帮助
|
7
bruce0 9 小时 44 分钟前
同一个编译器, clang, 我记得 Mac 上的 clang 现在还不支持 std::jthread 呢(上半年还不支持,不知道现在支持了吗), linux 的 clang 是支持的
|