Redian新闻
>
C++ 实现读写锁的问题 (vmware电面考过)
avatar
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拦住?
avatar
l*b
2
Need a semaphore for the counter ?
avatar
b*u
3
the mutex is for the counter.

【在 l*******b 的大作中提到】
: Need a semaphore for the counter ?
avatar
l*b
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.
avatar
p*p
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

avatar
s*x
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应该会好点

avatar
p*2
7
Java的典型实现是长什么样子的?
avatar
p*2
8

没明白你的问题。我理解读写锁本身写操作发生的就很少吧。两个写同时的概率很低的


【在 b*****u 的大作中提到】
: 电面反复被这种多线程的题虐,一怒之下今天看了一天pthread
: 在网上找到一个读写锁的代码,有一个问题不太清楚,代码如下
: http://www.broncho.cn/forum/viewtopic.php?t=1489
: 基本思想:
: 两个计数器 r_cnt, w_cnt
: 一个 mutex_cnt
: 一个 condition
: 读锁:
: {
: 锁mutex

avatar
p*p
9
我觉得两个都放后面就行了
counter的意思是有人在操作,而不是有人要操作

【在 s**x 的大作中提到】
:
: 我也觉得应该把 r_cnt ++ 放到 while 后面,不过 write的while条件 r_cnt + w_
: cnt >= 2 还是对的, 因为 w_cnt++ 在前, 至少是 1 了。
: 还有好像两个 signal 都应该用 broadcast.

avatar
s*x
10

那样做不到写优先。

【在 p*****p 的大作中提到】
: 我觉得两个都放后面就行了
: counter的意思是有人在操作,而不是有人要操作

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。