std::atomic 对于内置类型 - 非无锁与普通析构函数?

std::atomic for built-in types - non-lock-free vs. trivial destructor?

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

These specializations have standard layout, trivial default constructors, and trivial destructors.

我也读了 is_lock_free:

All atomic types except for std::atomic_flag may be implemented using mutexes or other locking operations, rather than using the lock-free atomic CPU instructions. Atomic types are also allowed to be sometimes lock-free, e.g. if only aligned memory accesses are naturally atomic on a given architecture, misaligned objects of the same type have to use locks.

下面是我不明白的问题:

标准规定 琐碎 ctor/dtor 的任何 atomic 类型怎么能使用任何类型的互斥体——我遇到的所有互斥体都需要-简单的初始化。

这导致了以下问题:

在我看来,即使是最简单的自旋锁(参见 atomic_flag)也需要重要的初始化,所以我看不出这是如何实现的。

免责声明:纯粹出于学术兴趣,因为我在阅读这些文档时突然想到了这一点。

这里有一个可能的解决方案:如果一个原子操作使用锁但是有一个普通的构造函数和析构函数,互斥量可能是一个在许多原子值之间共享的全局互斥量。

我相信,这是标准作者允许的情况。在某些常见平台(例如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 变量在你的构造函数 运行.

之前被初始化