gpt4 book ai didi

具有非平凡类型的 C++ 原子?

转载 作者:可可西里 更新时间:2023-11-01 18:33:06 33 4
gpt4 key购买 nike

阅读 boost::atomic 上的文档和 std::atomic 让我感到困惑的是 atomic 是否接口(interface)应该支持非平凡类型?

也就是说,给定一个只能通过将读/写包含在一个完整的互斥锁中来写/读的(值)类型,因为它有一个非平凡的复制构造函数/赋值运算符,这应该是由 std::atomic 支持(因为 boost 明确指出它是 UB)。

我应该提供特化吗 docs谈论我自己的非平凡类型?


注意:我之所以想到这个是因为我有一个跨线程回调对象 boost::function<bool (void)> simpleFn;需要自动设置/重置。拥有一个单独的互斥锁/关键部分,或者甚至将两者都包装在一个类似原子的辅助类型中,使用简单的 set 和 get 看起来很容易,但是有什么开箱即用的东西吗?

最佳答案

Arne 的回答已经指出,标准需要 std::atomic 的简单可复制类型。

首先,原子可能不是解决您的问题的正确工具的一些基本原理如下:原子是在 C++ 中构建线程安全数据结构的基本构建原语。它们应该是构建更强大的数据结构(如线程安全容器)的最低级构建 block 。

特别是,原子通常用于构建无锁数据结构。对于锁定数据结构原语,如 std::mutexstd::condition_variable 是一种更好的匹配方式,即使只是因为很难编写阻塞代码不引入大量忙碌等待的原子操作。

因此,当您想到 std::atomic 时,第一个关联应该是无锁(尽管事实上大多数原子类型在技术上都允许具有阻塞实现)。您描述的是一个简单的基于锁的并发数据结构,因此从概念的角度来看,将其包装在原子中应该已经感觉不对了。

不幸的是,目前尚不清楚如何用语言来表达数据结构是线程安全的(我猜这是您最初使用原子的主要意图)。 Herb Sutter 有 some interesting ideas在这个问题上,但我想现在我们只需要接受这样一个事实,即我们必须依靠文档来传达某些数据结构在线程安全方面的行为。

关于具有非平凡类型的 C++ 原子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16355425/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com