繁体   English   中英

C ++原子与非平凡类型?

[英]C++ atomic with non-trivial type?

读取boost::atomicstd::atomic上的文档让我对atomic接口是否应该支持非平凡类型感到困惑?

也就是说,给定一个(value-)类型只能通过将读/写封装在一个完整的互斥锁中来写入/读取,因为它有一个非平凡的copy-ctor /赋值运算符,这应该是std::atomic支持的std::atomic (因为提升清楚地表明它是UB)。

我是否应该提供文档谈论自己的非平凡类型的专业化?


注意:我正在尝试这个因为我有一个跨线程回调对象boost::function<bool (void)> simpleFn; 需要以原子方式设置/重置。 有一个单独的互斥/临界区,或者甚至用简单的集合包装在一个类似原子的助手类型中,看起来很容易,但有没有开箱即用的东西?

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

这里有一些理由说明原子可能不是最适合您的问题的工具:Atomics是在C ++中构建线程安全数据结构的基本构建原语。 它们应该是构建更强大的数据结构(如线程安全容器)的最低级构建块。

特别是,原子通常用于构建无锁数据结构 对于锁定数据结构,像std::mutexstd::condition_variable这样的原语是一种更好的匹配,如果只是因为很难用atomics编写阻塞代码而不引入大量繁忙的等待。

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

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

该标准规定了(§29.5,1)

模板参数T的类型应该是可以轻易复制的

意思是否,您不能使用具有非平凡复制或赋值操作的类型。

但是,与命名空间std中的任何模板一样,您可以自由地将模板专门用于实现尚未专门用于的任何类型的模板。 因此, 如果您真的想使用std::atomic<MyNonTriviallyCopyableType> ,则必须自己提供专业化。 这种专业化的行为取决于你,这意味着,你可以自由地吹掉你的腿或任何使用该专业的人的腿,因为它超出了标准的范围。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM