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
类型怎么能使用任何类型的互斥体——我遇到的所有互斥体都需要非-简单的初始化。
这导致了以下问题:
- 主要平台是否提供每个对象 "initalization free" 的任何锁定操作(如互斥锁)。 (那就是 "other locking operations"。)
- 今天是否有任何已知的默认
std::atomic
专业化不是无锁的实现(并且仍然满足 琐碎的 ctor/dtor 要求)?
- 我只是在这里搞混了吗? :-)
在我看来,即使是最简单的自旋锁(参见 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
变量在你的构造函数 运行.
之前被初始化
查看 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
类型怎么能使用任何类型的互斥体——我遇到的所有互斥体都需要非-简单的初始化。
这导致了以下问题:
- 主要平台是否提供每个对象 "initalization free" 的任何锁定操作(如互斥锁)。 (那就是 "other locking operations"。)
- 今天是否有任何已知的默认
std::atomic
专业化不是无锁的实现(并且仍然满足 琐碎的 ctor/dtor 要求)? - 我只是在这里搞混了吗? :-)
在我看来,即使是最简单的自旋锁(参见 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
变量在你的构造函数 运行.