C++ 实现读写锁的问题 (vmware电面考过)# JobHunting - 待字闺中
b*u
1 楼
电面反复被这种多线程的题虐,一怒之下今天看了一天pthread
在网上找到一个读写锁的代码,有一个问题不太清楚,代码如下
http://www.broncho.cn/forum/viewtopic.php?t=1489
基本思想:
两个计数器 r_cnt, w_cnt
一个 mutex_cnt
一个 condition
读锁:
{
锁mutex
r_cnt++;
while(w_cnt>0)等待condition
解锁mutex
}
解除读锁
{
锁mutex
r_cnt--;
if(r_cnt==0) signal condition
解锁mutex
}
写锁
{
锁mutex
w_cnt++;
while(r_cnt+w_cnt>=2) <=====××××这一步有问题××××
等待conditon
解锁mutex
}
解除写锁
{
锁mutex
w_cnt--;
广播condition
解除写锁
解锁mutex
}
原文说适用于读多写少的情况。但是想象一下如果目前有一个线程在写,另外有一个写
和若干读在等待, 这时写完了,广播了condition,但是等待的线程都出不了while循环
啊?我想了一下如果把有问题的那行改成if,可以解决这个问题,也就是说写只要等到
condition就再不判断counter了。不过如果有>=2个写在等待的话,会被同时唤醒,是
否有问题?还是说还是只有一个能写,其余的会被mutex拦住?
在网上找到一个读写锁的代码,有一个问题不太清楚,代码如下
http://www.broncho.cn/forum/viewtopic.php?t=1489
基本思想:
两个计数器 r_cnt, w_cnt
一个 mutex_cnt
一个 condition
读锁:
{
锁mutex
r_cnt++;
while(w_cnt>0)等待condition
解锁mutex
}
解除读锁
{
锁mutex
r_cnt--;
if(r_cnt==0) signal condition
解锁mutex
}
写锁
{
锁mutex
w_cnt++;
while(r_cnt+w_cnt>=2) <=====××××这一步有问题××××
等待conditon
解锁mutex
}
解除写锁
{
锁mutex
w_cnt--;
广播condition
解除写锁
解锁mutex
}
原文说适用于读多写少的情况。但是想象一下如果目前有一个线程在写,另外有一个写
和若干读在等待, 这时写完了,广播了condition,但是等待的线程都出不了while循环
啊?我想了一下如果把有问题的那行改成if,可以解决这个问题,也就是说写只要等到
condition就再不判断counter了。不过如果有>=2个写在等待的话,会被同时唤醒,是
否有问题?还是说还是只有一个能写,其余的会被mutex拦住?