[英]C++ atomic with non-trivial type?
读取boost::atomic
和std::atomic
上的文档让我对atomic
接口是否应该支持非平凡类型感到困惑?
也就是说,给定一个(value-)类型只能通过将读/写封装在一个完整的互斥锁中来写入/读取,因为它有一个非平凡的copy-ctor /赋值运算符,这应该是std::atomic
支持的std::atomic
(因为提升清楚地表明它是UB)。
我是否应该提供文档谈论自己的非平凡类型的专业化?
注意:我正在尝试这个因为我有一个跨线程回调对象boost::function<bool (void)> simpleFn;
需要以原子方式设置/重置。 有一个单独的互斥/临界区,或者甚至用简单的集合包装在一个类似原子的助手类型中,看起来很容易,但有没有开箱即用的东西?
Arne的回答已经指出标准需要std::atomic
简单可复制类型。
这里有一些理由说明原子可能不是最适合您的问题的工具:Atomics是在C ++中构建线程安全数据结构的基本构建原语。 它们应该是构建更强大的数据结构(如线程安全容器)的最低级构建块。
特别是,原子通常用于构建无锁数据结构 。 对于锁定数据结构,像std::mutex
和std::condition_variable
这样的原语是一种更好的匹配,如果只是因为很难用atomics编写阻塞代码而不引入大量繁忙的等待。
因此,当你想到std::atomic
,第一个关联应该是无锁的 (尽管事实上大多数原子类型在技术上都允许有阻塞实现)。 您所描述的是一个简单的基于锁的并发数据结构,因此从概念的角度来看,将它包装在原子中应该已经感觉不对了。
不幸的是,目前尚不清楚如何用语言表达数据结构是线程安全的(我猜这是你首先使用原子的主要意图)。 Herb Sutter在这个问题上有一些有趣的想法 ,但我想现在我们只需要接受这样一个事实,即我们必须依靠文档来传达某些数据结构在线程安全方面的表现。
该标准规定了(§29.5,1)
模板参数T的类型应该是可以轻易复制的
意思是否,您不能使用具有非平凡复制或赋值操作的类型。
但是,与命名空间std中的任何模板一样,您可以自由地将模板专门用于实现尚未专门用于的任何类型的模板。 因此, 如果您真的想使用std::atomic<MyNonTriviallyCopyableType>
,则必须自己提供专业化。 这种专业化的行为取决于你,这意味着,你可以自由地吹掉你的腿或任何使用该专业的人的腿,因为它超出了标准的范围。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.