- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
根据 Antony Williams 的书C++ Concurrency in Action,自旋锁可以按如下方式实现:
class spinlock_mutex {
std::atomic_flag flag;
public:
spinlock_mutex() : flag(ATOMIC_FLAG_INIT) {}
void lock() {
while (flag.test_and_set(std::memory_order_acquire)) ;
}
void unlock() {
flag.clear(std::memory_order_release);
}
};
如果我没理解错的话,memory_order_acquire
标签确保了最近使用 memory_order_release
标签的存储操作的可见性。 (“释放操作与获取操作同步。”)
因为 test_and_set
也是一个存储操作,我希望 lock()
方法中需要一个 memory_order_acq_rel
标签,以确保尝试锁定互斥锁的其他线程中锁定状态的可见性。
为什么 memory_order_acquire
就足够了?
最佳答案
acquire 和 release 与这个原子变量无关,而是与每个线程中读/写的其余变量有关。
更明显的是,如果没有 unlock()
中的释放和 lock()
中的获取,该标志仍然可见。问题是对受自旋锁保护的变量的写入可能会在锁释放后被推送,从而引入竞争条件。以同样的方式,锁内变量的读取可能会移动到 lock()
关于c++ - memory_order_acquire 真的足以锁定自旋锁吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21536846/
根据 Antony Williams 的书C++ Concurrency in Action,自旋锁可以按如下方式实现: class spinlock_mutex { std::atomic_fl
我最近了解了c++的六个内存顺序,我对memory_order_acquire和memory_order_release感到非常困惑,这是cpp的示例: #include #include #in
这个问题具体是关于引用计数指针中的普通可破坏类型。请参阅 Boost's documentation 中的示例关于原子的使用。 递减如下: if (x->refcount_.fetch_sub(1,
我一直在研究 C++ 11 中的内存顺序语义,但在理解 memory_order_acquire 在 CPU 级别的工作原理时遇到了一些困难。 根据cppreference; A load opera
我有一个关于 GCC-Wiki article 的问题.在标题“Overall Summary”下,给出了以下代码示例: 线程 1: y.store (20); x.store (10); 线程 2:
cppreference表示 std::memory_order_acquire 将阻止读取和写入在它之前重新排序。所以我可以使用 std::memory_order_acquire 只是为了防止在运
http://en.cppreference.com/w/cpp/atomic/memory_order和其他 C++11 在线引用资料,将 memory_order_acquire 和 memory
众所周知,在 x86 上,操作 load() 和 store() 内存屏障 memory_order_consume, memory_order_acquire, memory_order_relea
我对以下代码有疑问 #include #include #include std::atomic x, y; std::atomic z; void write_x_then_y() {
我想知道如果您有 2 个线程使用 memory_order_acquire 进行加载,一个线程使用 memory_acquire_release 进行存储,加载是否只会与两个执行加载的线程之一同步?意
我正在阅读 the documentation更具体地说 memory_order_acquire: A load operation with this memory order performs
我是一名优秀的程序员,十分优秀!