查看std::atomic
以及我读的默认专业:
这些专业化具有标准布局,普通默认构造函数和普通析构函数。
我也读过is_lock_free
:
除了
std::atomic_flag
之外的所有原子类型都可以使用 互斥锁或其他锁定操作,而不是使用无锁 原子CPU指令。有时也允许原子类型 无锁,例如如果只有对齐的内存访问是自然原子的 在给定的体系结构中,相同类型的未对齐对象必须 使用锁。
现在这是我没有得到的问题:
标准规定琐碎的ctor / dtor 的任何atomic
类型如何使用任何类型的互斥锁 - 我遇到的所有互斥锁都需要非 -trivial initialization。
这导致以下问题:
std::atomic
专业化,这些专业化不是无锁定的(并且仍满足琐碎的ctor / dtor 要求)?在我看来,即使是最简单的自旋锁(参见atomic_flag
)也需要进行非平凡的初始化,因此我无法看到如何实现这一点。
免责声明:纯粹出于学术兴趣,因为在阅读这些文档时,我有点跳了出来。
答案 0 :(得分:4)
这是一个可能的解决方案:如果原子操作使用锁但具有普通的构造函数和析构函数,则互斥锁可以是在许多原子值之间共享的全局互斥锁。
我认为,这是标准作者允许的情况。可以在一些常见平台(例如POSIX)上使用具有静态持续时间的互斥体的普通构造函数和析构函数。
// This is copied plain C here, not C++
// So nothing fancy
#include <pthread.h>
pthread_mutex_t my_mutex = PTHREAD_MUTEX_INITIALIZER;
如果允许std::atomic
默认构造函数是非平凡的,那么在初始化期间很难使用它们。
std::atomic<int> my_flag;
由于my_flag
具有普通构造函数,因此它是静态初始化的。动态初始化之前发生静态初始化因此,您可以确保在构造函数运行之前初始化所有全局std::atomic
变量。