C ++原子与非平凡类型?(C++ atomic with non-trivial type?)

2019-09-01 20:18发布

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

也就是说,给定一(值- )型只能写入/由封闭读读/在全互斥写,因为它有一个不平凡的拷贝构造函数/赋值运算符,这是应该由支持std::atomic (如boost明确指出,这是UB)。

我应该提供专业化的文档谈谈自己的不平凡的类型?


注:我打这个,因为我有一个跨线程回调对象boost::function<bool (void)> simpleFn; 需要设置/复位原子。 拥有一个单独的互斥/关键的部分,甚至在一个原子般的助手型与简单的设置都包裹并获得足够的似乎很容易,但有什么现成的?

Answer 1:

阿恩的答案已经指出,标准要求平凡可复制类型std::atomic

下面是一些理由,为什么原子公司可能不适合摆在首位你的问题正确的工具:原子公司是构建线程安全的数据结构,C中的基本组成元++。 他们应该是最低级别的积木构建更强大的数据结构,如线程安全的容器。

特别地,原子学通常用于建立无锁的数据结构 。 对于锁定的数据结构基元类似std::mutexstd::condition_variable是一种方式更好的匹配,如果只有一个事实,即它是非常难写与原子能阻止代码,而不会引入大量的忙等待。

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

不幸的是,目前还不清楚如何在一个数据结构是线程安全的语言表达(我的猜测是你在第一个地方使用原子主要意图)。 香草萨特有一些有趣的想法对这个问题,但我想现在我们只需要接受这样的事实,我们必须依靠文档进行数据通信的结构是如何表现的某些与关于线程安全。



Answer 2:

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

该类型的模板参数的T应是平凡的可复制

含义不,你不能使用类型的非平凡的拷贝构造函数或赋值运算。

然而,就像在空间std任何模板,你可以自由地专注于它没有被执行专门用于任何类型的模板。 所以,如果你真的想使用std::atomic<MyNonTriviallyCopyableType>你必须自己提供专业化。 是专业化的行为是你的,这意味着,你可以自由地吹掉你的腿或者使用专门的人的腿,因为这只是外界的标准的范围。



文章来源: C++ atomic with non-trivial type?
标签: c++ mutex atomic