我正在嘗試實現以下方案。如果系統中只有讀者,請不要使用互斥鎖。我寫了下面的實現。讀寫器併發性
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的3線(if(cntWriter > 1)
)後得到上下文切換和作家來了,那麼就可以得到mutexLock,因爲NOLOCK不遞增。在mutexLock之後,如果作者是上下文切換的,讀者也將被允許。我們已經讓讀者和作家一起。
如何避免這種情況?
編輯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我正在努力提高性能。甚至對讀者來說,獨佔互斥鎖也會嚴重降低性能。 – user2761431