我有一个互斥锁库,正在尝试实现写优先锁定。 我正在看这个例子:
https://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock
我了解读取优先锁定,但不了解写入优先锁定。有人可以解释如何实现吗?
具体来说,我不理解这一部分:
While w:
wait c, m
我也不知道标志w
是通用的还是每个进程只是一个不同的标志。我认为是前者。
例如,在这里我们看到了获取读锁的算法:
Lock m (blocking).
While (w or r > 0):
wait c, m
Set w to true.
Unlock m.
但是wait c, m
是什么意思?
这并不意味着要等待同时锁定c
和m
,因为我们已经在步骤1中锁定了m
。
而且,对于Set w to true
来说,这是否意味着w
必须在所有进程中或仅在此进程中都设置为true?
答案 0 :(得分:1)
问题has a subscript note中引用的Wikipedia文章指出:
This is the standard "wait" operation on condition variables, which, among other actions, releases the mutex m.
Standard "wait"通常接受两个参数:条件变量和互斥量。互斥锁m
由“等待”功能和thread sleeps until c
is signaled释放。发出m
信号并继续执行线程后,将重新获取c
锁(这可能需要等待,如果已在其他位置获取了锁)。
将(全局)标志w
设置为true表示当前写线程正在声明写锁定。
只有在通过修改条件变量m
,整数c
(等待阅读器的数量)来协商设置critical section设置或释放读/写状态的conditional variable时,锁定互斥锁r
,标记w
(正在等待写作者)。
您发布的用于获取读锁(实际上正在获取写锁,因此Set w to true
)的伪代码同时使用了互斥锁(m
)和{{3} }(c
)。首先,它试图在互斥体m
上获得排他锁,以便以原子方式修改相关输入。一旦完成此操作,如果wait c, m
(写锁定)或w
(读者等待)不为零,它将调用r
。
总结:
“等待”功能接受两个参数:c
和m
。它释放m
并休眠,直到在c
上收到信号为止。
互斥锁m
在设置或释放读取或写入锁定时被锁定。