c++ - 自旋锁能保证获取顺序吗?
问题描述
我有一个与此类似的简单自旋锁实现:
class Spinlock{
std::atomic_flag flag;
public:
Spinlock(): flag(ATOMIC_FLAG_INIT) {}
~Spinlock() {}
void lock(){
while(flag.test_and_set(std::memory_order_acquire));
}
void unlock(){
flag.clear(std::memory_order_release);
}
};
我的问题类似于互斥锁上的这个问题,但对于自旋锁:
- 线程 1 调用 lock()
- 在线程 1 调用 unlock() 之前,线程 2 和 3 都调用了 lock()。
是否保证线程 2 会在线程 3 之前获得自旋锁?
如果没有,是否有任何保证获取顺序的锁实现?
解决方案
不,没有任何形式的排队或排序,因为普通的自旋锁实际上只是重复的竞赛;每次尝试获取失败时,都没有记忆被转移到下一次尝试,它只是在比赛并希望获胜。线程 2 或 3 能够以大致相同的可能性获得它,即使线程 2 在其上旋转了一分钟,线程 3 旋转了一微秒。
推荐阅读
- xaml - 我们可以在 oxyplot 图中添加渐变颜色吗
- r - 重新排序列表中矩阵的行名,并将 NaN 和零替换为一
- autohotkey - 关闭 GUI 但继续 AHK 中的脚本
- angular - 禁用订阅
- r - 如何使用 R 中的 ggplot2 在渐变上为多个 geom_lines 着色?
- youtube-api - 有没有办法获取 Youtube 频道的“会员”信息
- php - 未应用 Laravel 和 MySQL .env 配置
- java - java- repaint() 方法行为不端 - 2?
- python-3.x - 创建python包的最佳编码实践是什么
- javascript - 为什么参数设置为“Mickey”时返回的“Hey Mickey”不一样?