我发现许多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();
编辑:
感谢您的回答。 我现在将答案改为原子当量
答案 0 :(得分:3)
如果线程同时访问r
和w
,则它们具有数据争用。如果C ++程序具有数据争用,则该程序的行为是不确定的。
int
是原子的。即使我们假设访问int
的系统是原子操作,即使在这样的系统上,operator++
也可能不是原子操作。因此,同时增加可能会“消失”。
此外,在write_lock
中的循环之后,另一个线程也可以在w
递增之前结束其循环,从而允许多个同时写入器-我认为此锁定应该可以防止。
最后,这似乎是尝试实现自旋锁。自旋锁具有优点和缺点。它们的缺点是阻塞时会消耗线程的所有CPU周期。这是资源的低效使用,不利于电池时间,不利于可能已经使用这些循环的其他过程。但是,如果等待时间短,那将是最佳选择。