由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - C++ 实现读写锁的问题 (vmware电面考过)
相关主题
哪里有mutex和semaphore例子?Google 电面面经
qualcomm 新鲜电面面经过两天要电面NVIDIA,有高人提点一下方向么?
L 电面找工总结(弱面经和offer)
linkedin电面第二轮,赞国人同胞Bloomberg电面面经
发一个MathWorks的电面一道电面的题目
bloomberg电面,攒rp求bless要电面一个我自己都觉得不太可能的职位
Bloomberg的电面 希望对你有用兼攒rp郁闷的问,大家有多少是因为口语原因电面被拒?
Quantcast电面报个vmware电面攒人品
相关话题的讨论汇总
话题: cnt话题: mutex话题: condition话题: 写锁话题: counter
进入JobHunting版参与讨论
1 (共1页)
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
7
Java的典型实现是长什么样子的?
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的意思是有人在操作,而不是有人要操作

1 (共1页)
进入JobHunting版参与讨论
相关主题
报个vmware电面攒人品发一个MathWorks的电面
求帮选offer:VMware和Coursera, 以及接下来怎么投bloomberg电面,攒rp求bless
一道亚麻电面题目Bloomberg的电面 希望对你有用兼攒rp
贡献qualcomm的电面攒人品吧Quantcast电面
哪里有mutex和semaphore例子?Google 电面面经
qualcomm 新鲜电面面经过两天要电面NVIDIA,有高人提点一下方向么?
L 电面找工总结(弱面经和offer)
linkedin电面第二轮,赞国人同胞Bloomberg电面面经
相关话题的讨论汇总
话题: cnt话题: mutex话题: condition话题: 写锁话题: counter