-3

我发现互联网上的许多读写自旋锁实现都不必要地复杂。我用 C++ 编写了一个简单的读写锁。

谁能告诉我,如果我遗漏了什么?

int r = 0;
int w = 0;

read_lock(void) 
{
     atomic_inc(r); //increment value atomically
     while( w != 0);    
}

read_unlock(void)
{
   atomic_dec(r); // Decrement value atomically
}
write_lock(void)
{
 while( (r != 0) && 
            ( w != 0))
  atomic_inc(w); //increment value atomically
}

write_unlock(void)
{
    atomic_dec(w); //Decrement value atomically
}

用法如下。

read_lock()
// Critical Section
read_unlock();

write_lock()
// Critical Section
write_unlock();

编辑:

感谢您的回答。我现在将答案更改为原子等价物

4

1 回答 1

3

如果线程同时访问r和访问w,它们就会发生数据竞争。如果 C++ 程序存在数据竞争,则程序的行为是未定义的。

intC++ 标准不保证是原子的。即使我们假设访问 an 的系统int是原子的, operator++即使在这样的系统上也可能不是原子操作。因此,同时增量可能会“消失”。

此外,在循环之后write_lock,另一个线程也可以在w递增之前结束它们的循环,从而允许多个同时写入者——我认为这个锁应该可以防止。


最后,这似乎是实现自旋锁的尝试。自旋锁有优点也有缺点。它们的缺点是它们在阻塞时会消耗其线程的所有 CPU 周期。这是对资源的高度低效使用,不利于电池使用时间,也不利于其他可能使用这些周期的进程。但是如果等待时间很短,它可能是最佳的。

于 2019-03-20T16:55:15.853 回答