b*****u 发帖数: 648 | 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拦住? |
l*******b 发帖数: 2586 | 2 Need a semaphore for the counter ? |
b*****u 发帖数: 648 | 3 the mutex is for the counter.
【在 l*******b 的大作中提到】 : Need a semaphore for the counter ?
|
l*******b 发帖数: 2586 | 4 may be need several mutex to lock them... if the counter is a semaphore,
then it will pick one to wake up.
wiki: To avoid starvation, a semaphore has an associated queue of processes
(usually a first-in, first out)
【在 b*****u 的大作中提到】 : the mutex is for the counter.
|
p*****p 发帖数: 379 | 5 把counter++之类的放到while的后面
把write的while条件改成r_cnt + write_cnt > 0
我觉得这样就行了,但是这代码会造成读的人多了写不进去,广播那里也有待商榷
所以把这套换成一个semaphore应该会好点
【在 b*****u 的大作中提到】 : 电面反复被这种多线程的题虐,一怒之下今天看了一天pthread : 在网上找到一个读写锁的代码,有一个问题不太清楚,代码如下 : http://www.broncho.cn/forum/viewtopic.php?t=1489 : 基本思想: : 两个计数器 r_cnt, w_cnt : 一个 mutex_cnt : 一个 condition : 读锁: : { : 锁mutex
|
s**x 发帖数: 7506 | 6
我也觉得应该把 r_cnt ++ 放到 while 后面,不过 write的while条件 r_cnt + w_
cnt >= 2 还是对的, 因为 w_cnt++ 在前, 至少是 1 了。
还有好像两个 signal 都应该用 broadcast.
【在 p*****p 的大作中提到】 : 把counter++之类的放到while的后面 : 把write的while条件改成r_cnt + write_cnt > 0 : 我觉得这样就行了,但是这代码会造成读的人多了写不进去,广播那里也有待商榷 : 所以把这套换成一个semaphore应该会好点
|
p*****2 发帖数: 21240 | |
p*****2 发帖数: 21240 | 8
没明白你的问题。我理解读写锁本身写操作发生的就很少吧。两个写同时的概率很低的
。
【在 b*****u 的大作中提到】 : 电面反复被这种多线程的题虐,一怒之下今天看了一天pthread : 在网上找到一个读写锁的代码,有一个问题不太清楚,代码如下 : http://www.broncho.cn/forum/viewtopic.php?t=1489 : 基本思想: : 两个计数器 r_cnt, w_cnt : 一个 mutex_cnt : 一个 condition : 读锁: : { : 锁mutex
|
p*****p 发帖数: 379 | 9 我觉得两个都放后面就行了
counter的意思是有人在操作,而不是有人要操作
【在 s**x 的大作中提到】 : : 我也觉得应该把 r_cnt ++ 放到 while 后面,不过 write的while条件 r_cnt + w_ : cnt >= 2 还是对的, 因为 w_cnt++ 在前, 至少是 1 了。 : 还有好像两个 signal 都应该用 broadcast.
|
s**x 发帖数: 7506 | 10
那样做不到写优先。
【在 p*****p 的大作中提到】 : 我觉得两个都放后面就行了 : counter的意思是有人在操作,而不是有人要操作
|