【发布时间】:2017-11-22 15:39:13
【问题描述】:
我正在尝试实现以下场景。如果系统中只有读者,请不要使用互斥锁。我编写了以下实现。
LockReader()
{
flag = 0;
atomic increment cntReader;
if(atomic check cntWriter > 0)
{
while(noLock != 0);
flag = 1;
mutexLock(var);
}
else
{
atomic increment noLock;
}
//CS
if(flag == 1)
mutexUnlock(var);
else
atomic decrement noLock;
atomic decrement cntReader;
}
LockWriter()
{
atomic increment cntWriter;
if(atomic check cntReader > 0)
{
while(noLock != 0);
}
mutexLock(var);
mutexUnlock(var);
atomic decrement cntWriter;
}
但是这段代码的问题是,如果有一个读取器,并且在评估 LockShared(if(cntWriter > 1)) 的第 3 行之后它获得了上下文切换并且写入器来了,那么它可以获得互斥锁,因为 noLock 还没有增加.并且在互斥锁之后,如果写者被上下文切换,读者也将被允许。我们让读者和作家在一起。
如何避免这种情况?
编辑 1: 我以这种方式更改了 LockReader():
LockReader()
{
flag = 0;
atomic increment cntReader;
atomic increment noLock;
if(atomic check cntWriter > 0)
{
atomic decrement noLock;
while(noLock != 0);
flag = 1;
mutexLock(var);
}
//CS
if(flag == 1)
mutexUnlock(var);
else
atomic decrement noLock;
atomic decrement cntReader;
}
我认为这应该可以解决我提到的问题。但是还有其他可能的读写器并发问题吗?
编辑 2:也添加了解锁代码。
【问题讨论】:
-
您为什么要这样做?非竞争锁的获取成本不应该很高。似乎是错误的优化。
-
为了完整起见,能否提供相应的解锁功能?
-
@JohnZwinck 我正在努力提高性能。即使对读者采取独占互斥锁也会严重降低性能。
-
@AndriyBerestovskyy 已添加。
标签: c multithreading gcc concurrency pthreads