简单读写锁

时间:2019-03-20 16:40:35

标签: c++ concurrency locking readwritelock

我发现许多Internet上的自旋锁实现不必要地复杂。我已经用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();

编辑:

感谢您的回答。 我现在将答案改为原子当量

1 个答案:

答案 0 :(得分:3)

如果线程同时访问rw,则它们具有数据争用。如果C ++程序具有数据争用,则该程序的行为是不确定的。

C ++标准不保证

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

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


最后,这似乎是尝试实现自旋锁。自旋锁具有优点和缺点。它们的缺点是阻塞时会消耗线程的所有CPU周期。这是资源的低效使用,不利于电池时间,不利于可能已经使用这些循环的其他过程。但是,如果等待时间短,那将是最佳选择。