内置类型的std :: atomic - 非锁定与普通的析构函数?

时间:2016-12-23 22:12:11

标签: c++ multithreading mutex atomic lock-free

查看std::atomic以及我读的默认专业:

  

这些专业化具有标准布局,普通默认构造函数普通析构函数

我也读过is_lock_free

  

除了std::atomic_flag 之外的所有原子类型都可以使用   互斥锁或其他锁定操作,而不是使用无锁   原子CPU指令。有时也允许原子类型   无锁,例如如果只有对齐的内存访问是自然原子的   在给定的体系结构中,相同类型的未对齐对象必须   使用锁。

现在这是我没有得到的问题:

标准规定琐碎的ctor / dtor 的任何atomic类型如何使用任何类型的互斥锁 - 我遇到的所有互斥锁都需要 -trivial initialization。

这导致以下问题:

  • 主要平台是否提供每个对象“无法初始化”的任何锁定操作(如互斥锁)。 (那将是“其他锁定操作”。)
  • 今天是否有任何已知的实现默认std::atomic专业化,这些专业化不是无锁定的(并且仍满足琐碎的ctor / dtor 要求)?
  • 我只是在这里混淆了什么? : - )

在我看来,即使是最简单的自旋锁(参见atomic_flag)也需要进行非平凡的初始化,因此我无法看到如何实现这一点。

免责声明:纯粹出于学术兴趣,因为在阅读这些文档时,我有点跳了出来。

1 个答案:

答案 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变量。