V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cnbatch
V2EX  ›  C++

atomic<shared_ptr<T>>在 GCC 和 Clang 的受支持程度真是一言难尽

  •  
  •   cnbatch · 16 小时 33 分钟前 · 767 次点击

    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的效率不太高,需要重写,作者直接不干了

    7 条回复    2024-10-20 23:39:14 +08:00
    Coelacanthus
        1
    Coelacanthus  
       14 小时 53 分钟前
    GCC 12 分支最新的 fix 版本是 12.4 啊,Debian 他们居然没更新。你可以给他们提个 request 要求更新,理由就是有已知 bug 。
    felixlong
        2
    felixlong  
       14 小时 24 分钟前
    把 shared_ptr 放到 atomic 里面的使用场景是什么?
    cnbatch
        3
    cnbatch  
    OP
       11 小时 14 分钟前
    @Coelacanthus 刚用 reportbug 命令向 Debian 提交了,暂时还没什么反应,就连编号都还没生成。
    不太熟悉他们的流程,看来只能继续等待
    cnbatch
        4
    cnbatch  
    OP
       11 小时 5 分钟前
    @felixlong 多线程读写会用到,放进 atomic 就不需要再用 mutex 了。

    举个例子,atomic<shared_ptr<Description>>,用来保存一段文字描述,修改时直接 make_shared<Description>,其他线程读取时调用 load() 成员函数或者用 std::atomic_load(),可以确保修改与读取互不干扰。对于时间敏感度不高的场景会很方便,起码不会死锁。
    flax5a98aa2
        5
    flax5a98aa2  
       10 小时 0 分钟前
    https://en.cppreference.com/w/cpp/header/hazard_pointer 这个是不是更有盼头一点?
    flax5a98aa2
        6
    flax5a98aa2  
       9 小时 56 分钟前
    [Lock-free Atomic Shared Pointers Without a Split Reference Count? It Can Be Done!](
    ) 还有这个,我以前看没看懂,看到这个帖子想起来了,不知道是否对你有帮助
    bruce0
        7
    bruce0  
       9 小时 44 分钟前
    同一个编译器, clang, 我记得 Mac 上的 clang 现在还不支持 std::jthread 呢(上半年还不支持,不知道现在支持了吗), linux 的 clang 是支持的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5171 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 01:23 · PVG 09:23 · LAX 18:23 · JFK 21:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.