我有一个类似于以下内容的简单自旋锁实现:

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

我的问题类似于互斥锁上的this one,但对于自旋锁:
  • 线程1调用lock()
  • 在线程1调用unlock()之前,线程2和3都调用lock()。

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

    如果不是,是否有任何可以确保获取顺序的锁实现?

    最佳答案

    不,没有任何排队或排序方法,因为普通的自旋锁实际上只是重复的比赛。每次尝试失败时,都不会将内存转移到下一次尝试中,这只是在竞速并希望获胜。即使线程2在其上旋转了一分钟,而线程3在微秒上旋转,线程2或3仍可以大致相等地获取它。

    关于c++ - 自旋锁是否可以确保获取顺序?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55842075/

    10-10 16:48