由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 请教一下那道H2O的题
相关主题
请教L家生成H2O水分子的题。是不是被印度人故意往沟里带
想问一下那道H2O的多线程题pthread 编程还是要看看阿
multi-threading guru们攒人品。面试经历(2)
read-write locker的实现问道多线程的简单题目
请教大牛用mutex lock实现reader writer lock人生中第一次面试
碰到面试官水平太差看不懂答案怎么办?C++ Singleton的实现
一个多线程的题目,这个写法可以过关么nVidia phone interview (intern Infrastructure Arch)
请问pure storage 的那道用spin lock and flags to implement mutex怎么做Palantir 2nd coding interview [pass, set for on-site]
相关话题的讨论汇总
话题: cond话题: mutex话题: pthread话题: ocounter话题: hcounter
进入JobHunting版参与讨论
1 (共1页)
K********y
发帖数: 47
1
(原贴见http://www.mitbbs.com/article/JobHunting/32331973_3.html
3: 实现两个函数: H() and O(), 这两个函数会被多线程调用。当一个线程调用H或O时
,如果当前已经有至少两个线程call H和一个线程call O。那么让两个call H和一个
call O的线程返回(产生一个水分子),其他的都block。
多线程我不熟,pthread里没有现成的semaphore,所以习惯用condition variable。闭
门造车写了下面这样一个解法,显然不如版上各位给的代码简洁。但是这里有个bug我
想不明白,请教一下各位:
我的基本想法是,如果三个原子里最后一个就位的是H,则signal O,O再signal另一个
H;如果最后一个是O,则signal一个H,这个H再signal另一个H。为了区分H函数的两种
情况,我起初用了个bool signalNextH,但是会出现死锁。改成int来计数就过了(下
面的代码)。从这个症状来看,似乎是有两个O原子同时发出了signal,所以
signalNextH要用counter,不能用简单的bool。可是为什么会有这种情况,从O发出
signal到H wakeup之间不应该没有机会让另一个O插队吗?多谢!
void H2OHelper::H()
{
pthread_mutex_lock(&mutex);
++hCounter;
if (hCounter >= 2 && oCounter >= 1)
{
pthread_cond_signal(&cond_Havailable);
pthread_mutex_unlock(&mutex);
}
else
{
while (hCounter < 2 || oCounter < 1)
pthread_cond_wait(&cond_Oavailable, &mutex);
if (signalNextH > 0)
{
--signalNextH;
pthread_cond_signal(&cond_Oavailable);
}
else
{
hCounter -= 2;
oCounter -= 1;
}
pthread_mutex_unlock(&mutex);
}
}
void H2OHelper::O()
{
pthread_mutex_lock(&mutex);
++oCounter;
if (hCounter >= 2 && oCounter >= 1)
{
++signalNextH;
pthread_cond_signal(&cond_Oavailable);
pthread_mutex_unlock(&mutex);
}
else
{
while (hCounter < 2 || oCounter < 1)
pthread_cond_wait(&cond_Havailable, &mutex);
pthread_cond_signal(&cond_Oavailable);
pthread_mutex_unlock(&mutex);
}
}
d**********x
发帖数: 4083
2
谁说pthread里面没有现成的semaphore...
请自行google sem_t。。。

【在 K********y 的大作中提到】
: (原贴见http://www.mitbbs.com/article/JobHunting/32331973_3.html
: 3: 实现两个函数: H() and O(), 这两个函数会被多线程调用。当一个线程调用H或O时
: ,如果当前已经有至少两个线程call H和一个线程call O。那么让两个call H和一个
: call O的线程返回(产生一个水分子),其他的都block。
: 多线程我不熟,pthread里没有现成的semaphore,所以习惯用condition variable。闭
: 门造车写了下面这样一个解法,显然不如版上各位给的代码简洁。但是这里有个bug我
: 想不明白,请教一下各位:
: 我的基本想法是,如果三个原子里最后一个就位的是H,则signal O,O再signal另一个
: H;如果最后一个是O,则signal一个H,这个H再signal另一个H。为了区分H函数的两种
: 情况,我起初用了个bool signalNextH,但是会出现死锁。改成int来计数就过了(下

I*********g
发帖数: 93
3
想一想用两个conditional variable

【在 K********y 的大作中提到】
: (原贴见http://www.mitbbs.com/article/JobHunting/32331973_3.html
: 3: 实现两个函数: H() and O(), 这两个函数会被多线程调用。当一个线程调用H或O时
: ,如果当前已经有至少两个线程call H和一个线程call O。那么让两个call H和一个
: call O的线程返回(产生一个水分子),其他的都block。
: 多线程我不熟,pthread里没有现成的semaphore,所以习惯用condition variable。闭
: 门造车写了下面这样一个解法,显然不如版上各位给的代码简洁。但是这里有个bug我
: 想不明白,请教一下各位:
: 我的基本想法是,如果三个原子里最后一个就位的是H,则signal O,O再signal另一个
: H;如果最后一个是O,则signal一个H,这个H再signal另一个H。为了区分H函数的两种
: 情况,我起初用了个bool signalNextH,但是会出现死锁。改成int来计数就过了(下

K********y
发帖数: 47
4

好吧,土人没用过。不过我的代码为什么用bool signalNextH 会有问题呢?

【在 d**********x 的大作中提到】
: 谁说pthread里面没有现成的semaphore...
: 请自行google sem_t。。。

K********y
发帖数: 47
5
(原贴见http://www.mitbbs.com/article/JobHunting/32331973_3.html
3: 实现两个函数: H() and O(), 这两个函数会被多线程调用。当一个线程调用H或O时
,如果当前已经有至少两个线程call H和一个线程call O。那么让两个call H和一个
call O的线程返回(产生一个水分子),其他的都block。
多线程我不熟,pthread里没有现成的semaphore,所以习惯用condition variable。闭
门造车写了下面这样一个解法,显然不如版上各位给的代码简洁。但是这里有个bug我
想不明白,请教一下各位:
我的基本想法是,如果三个原子里最后一个就位的是H,则signal O,O再signal另一个
H;如果最后一个是O,则signal一个H,这个H再signal另一个H。为了区分H函数的两种
情况,我起初用了个bool signalNextH,但是会出现死锁。改成int来计数就过了(下
面的代码)。从这个症状来看,似乎是有两个O原子同时发出了signal,所以
signalNextH要用counter,不能用简单的bool。可是为什么会有这种情况,从O发出
signal到H wakeup之间不应该没有机会让另一个O插队吗?多谢!
void H2OHelper::H()
{
pthread_mutex_lock(&mutex);
++hCounter;
if (hCounter >= 2 && oCounter >= 1)
{
pthread_cond_signal(&cond_Havailable);
pthread_mutex_unlock(&mutex);
}
else
{
while (hCounter < 2 || oCounter < 1)
pthread_cond_wait(&cond_Oavailable, &mutex);
if (signalNextH > 0)
{
--signalNextH;
pthread_cond_signal(&cond_Oavailable);
}
else
{
hCounter -= 2;
oCounter -= 1;
}
pthread_mutex_unlock(&mutex);
}
}
void H2OHelper::O()
{
pthread_mutex_lock(&mutex);
++oCounter;
if (hCounter >= 2 && oCounter >= 1)
{
++signalNextH;
pthread_cond_signal(&cond_Oavailable);
pthread_mutex_unlock(&mutex);
}
else
{
while (hCounter < 2 || oCounter < 1)
pthread_cond_wait(&cond_Havailable, &mutex);
pthread_cond_signal(&cond_Oavailable);
pthread_mutex_unlock(&mutex);
}
}
d**********x
发帖数: 4083
6
谁说pthread里面没有现成的semaphore...
请自行google sem_t。。。

【在 K********y 的大作中提到】
: (原贴见http://www.mitbbs.com/article/JobHunting/32331973_3.html
: 3: 实现两个函数: H() and O(), 这两个函数会被多线程调用。当一个线程调用H或O时
: ,如果当前已经有至少两个线程call H和一个线程call O。那么让两个call H和一个
: call O的线程返回(产生一个水分子),其他的都block。
: 多线程我不熟,pthread里没有现成的semaphore,所以习惯用condition variable。闭
: 门造车写了下面这样一个解法,显然不如版上各位给的代码简洁。但是这里有个bug我
: 想不明白,请教一下各位:
: 我的基本想法是,如果三个原子里最后一个就位的是H,则signal O,O再signal另一个
: H;如果最后一个是O,则signal一个H,这个H再signal另一个H。为了区分H函数的两种
: 情况,我起初用了个bool signalNextH,但是会出现死锁。改成int来计数就过了(下

I*********g
发帖数: 93
7
想一想用两个conditional variable

【在 K********y 的大作中提到】
: (原贴见http://www.mitbbs.com/article/JobHunting/32331973_3.html
: 3: 实现两个函数: H() and O(), 这两个函数会被多线程调用。当一个线程调用H或O时
: ,如果当前已经有至少两个线程call H和一个线程call O。那么让两个call H和一个
: call O的线程返回(产生一个水分子),其他的都block。
: 多线程我不熟,pthread里没有现成的semaphore,所以习惯用condition variable。闭
: 门造车写了下面这样一个解法,显然不如版上各位给的代码简洁。但是这里有个bug我
: 想不明白,请教一下各位:
: 我的基本想法是,如果三个原子里最后一个就位的是H,则signal O,O再signal另一个
: H;如果最后一个是O,则signal一个H,这个H再signal另一个H。为了区分H函数的两种
: 情况,我起初用了个bool signalNextH,但是会出现死锁。改成int来计数就过了(下

K********y
发帖数: 47
8

好吧,土人没用过。不过我的代码为什么用bool signalNextH 会有问题呢?

【在 d**********x 的大作中提到】
: 谁说pthread里面没有现成的semaphore...
: 请自行google sem_t。。。

h*****a
发帖数: 1718
9
这道题写对也不容易啊。

【在 K********y 的大作中提到】
: (原贴见http://www.mitbbs.com/article/JobHunting/32331973_3.html
: 3: 实现两个函数: H() and O(), 这两个函数会被多线程调用。当一个线程调用H或O时
: ,如果当前已经有至少两个线程call H和一个线程call O。那么让两个call H和一个
: call O的线程返回(产生一个水分子),其他的都block。
: 多线程我不熟,pthread里没有现成的semaphore,所以习惯用condition variable。闭
: 门造车写了下面这样一个解法,显然不如版上各位给的代码简洁。但是这里有个bug我
: 想不明白,请教一下各位:
: 我的基本想法是,如果三个原子里最后一个就位的是H,则signal O,O再signal另一个
: H;如果最后一个是O,则signal一个H,这个H再signal另一个H。为了区分H函数的两种
: 情况,我起初用了个bool signalNextH,但是会出现死锁。改成int来计数就过了(下

c******a
发帖数: 789
10
真的,我要遇到了一定死啦死啦地。

【在 h*****a 的大作中提到】
: 这道题写对也不容易啊。
相关主题
碰到面试官水平太差看不懂答案怎么办?是不是被印度人故意往沟里带
一个多线程的题目,这个写法可以过关么pthread 编程还是要看看阿
请问pure storage 的那道用spin lock and flags to implement mutex怎么做攒人品。面试经历(2)
进入JobHunting版参与讨论
t*q
发帖数: 104
11
你自己已经回答了自己的问题,你的程序可以简化:
void H2OHelper::H()
{
pthread_mutex_lock(&mutex);
++hCounter;
if (hCounter >= 2 && oCounter >= 1)
{
hCounter -= 2;
oCounter -= 1;
pthread_cond_signal(&cond_H);
pthread_cond_signal(&cond_O);
}
else
{
pthread_cond_wait(&cond_H, &mutex);
}
pthread_mutex_unlock(&mutex);
}
void H2OHelper::O()
{
pthread_mutex_lock(&mutex);
++oCounter;
if (hCounter >= 2 && oCounter >= 1)
{
hCounter -= 2;
oCounter -= 1;
pthread_cond_signal(&cond_H);
pthread_cond_signal(&cond_H);
}
else
{
pthread_cond_wait(&cond_O, &mutex);
}
pthread_mutex_unlock(&mutex);
}
假设没有spurious wakeup。

【在 K********y 的大作中提到】
:
: 好吧,土人没用过。不过我的代码为什么用bool signalNextH 会有问题呢?

K********y
发帖数: 47
12
谢谢回复!我果然弄得太复杂了。
不过我还是不明白为什么用bool signalNextH会有问题?……

【在 t*q 的大作中提到】
: 你自己已经回答了自己的问题,你的程序可以简化:
: void H2OHelper::H()
: {
: pthread_mutex_lock(&mutex);
: ++hCounter;
: if (hCounter >= 2 && oCounter >= 1)
: {
: hCounter -= 2;
: oCounter -= 1;
: pthread_cond_signal(&cond_H);

s*****n
发帖数: 5488
13
run an example
e.g.,
H H O O O O O O
if O threads has higher priority then
H O (1, 0) signalNextH = 0
(2, 0) 0
(2,1) 1
(2,2) 2
(2, 3) 3,
(2, 4), 4
.......
all four O threads will exit eventually, which is in correct.

【在 K********y 的大作中提到】
: 谢谢回复!我果然弄得太复杂了。
: 不过我还是不明白为什么用bool signalNextH会有问题?……

n**s
发帖数: 2230
14
没这么麻烦。有现成的semophore,mutex
K********y
发帖数: 47
15
int signalNextH没问题。我最早用bool就有问题了……

【在 s*****n 的大作中提到】
: run an example
: e.g.,
: H H O O O O O O
: if O threads has higher priority then
: H O (1, 0) signalNextH = 0
: (2, 0) 0
: (2,1) 1
: (2,2) 2
: (2, 3) 3,
: (2, 4), 4

t*q
发帖数: 104
16
你自己已经回答了啊,多次O调用激活多个H的时候,你会有些该唤醒的H没有唤醒,这个
不叫死锁。

【在 K********y 的大作中提到】
: int signalNextH没问题。我最早用bool就有问题了……
K********y
发帖数: 47
17
所以说,O原子flip signalNextH,发出condition signal后,如果没有H原子线程接住
,这个时候可能有别的O原子进来,是吗?

这个

【在 t*q 的大作中提到】
: 你自己已经回答了啊,多次O调用激活多个H的时候,你会有些该唤醒的H没有唤醒,这个
: 不叫死锁。

1 (共1页)
进入JobHunting版参与讨论
相关主题
Palantir 2nd coding interview [pass, set for on-site]请教大牛用mutex lock实现reader writer lock
谁给讲讲test-and-set怎么实现mutex?碰到面试官水平太差看不懂答案怎么办?
Deadlock in Java一个多线程的题目,这个写法可以过关么
nvidia面筋请问pure storage 的那道用spin lock and flags to implement mutex怎么做
请教L家生成H2O水分子的题。是不是被印度人故意往沟里带
想问一下那道H2O的多线程题pthread 编程还是要看看阿
multi-threading guru们攒人品。面试经历(2)
read-write locker的实现问道多线程的简单题目
相关话题的讨论汇总
话题: cond话题: mutex话题: pthread话题: ocounter话题: hcounter