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

Mar*_* Ba 7 c++ mutex atomic

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

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

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


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

Com*_*sMS 6

Arne 的回答已经指出,标准要求std::atomic.

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

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

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

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