首页 > 解决方案 > 自旋锁能保证获取顺序吗?

问题描述

我有一个与此类似的简单自旋锁实现:

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);
  }
};

我的问题类似于互斥锁上的这个问题,但对于自旋锁:

是否保证线程 2 会在线程 3 之前获得自旋锁?

如果没有,是否有任何保证获取顺序的锁实现?

标签: c++multithreadingc++11

解决方案


不,没有任何形式的排队或排序,因为普通的自旋锁实际上只是重复的竞赛;每次尝试获取失败时,都没有记忆被转移到下一次尝试,它只是在比赛并希望获胜。线程 2 或 3 能够以大致相同的可能性获得它,即使线程 2 在其上旋转了一分钟,线程 3 旋转了一微秒。


推荐阅读