由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 急求大神指导一道面经
相关主题
read-write locker的实现一个多线程的题目,这个写法可以过关么
MITBBS 面试题第一题请问pure storage 的那道用spin lock and flags to implement mutex怎么做
pthread 编程还是要看看阿failed bloomberg phone interview
贡献一道湾区小公司的面试题 Medallia攒人品。面试经历(1)
C++ 实现读写锁的问题 (vmware电面考过)攒人品。面试经历(2)
问道多线程的简单题目bloomberg电面,攒rp求bless
贡献T家新鲜面经,求个bless为啥说semaphore是进程间的一种通信机制?
哪里有mutex和semaphore例子?昨天onsite被问到的 multithreading 题目
相关话题的讨论汇总
话题: pthread话题: num话题: self话题: os话题: void
进入JobHunting版参与讨论
1 (共1页)
G*********n
发帖数: 53
1
突然收到了linkedin的onsite通知,在后天,看了一下面经有一道题不会做,是多线程
的题,最好能给出java的解法。求各位大神指点,先谢谢了。题目是
实现两个函数: H() and O(), 这两个函数会被多线程调用。当一个线程调用H或O时
,如果当前已经有至少两个线程call H和一个线程call O。那么让两个call H和一个
call O的线程返回(产生一个水分子),其他的都block。
w*****d
发帖数: 105
2
个人浅见,C++风格的伪码:
mutex m;
condition hc, oc;
set hq, oq;
H() {
m.lock();
hq.insert(pthread_self());
if(hq.size() > 1 && !oq.empty()){
hc.signal();
hc.signal();
oc.signal();
}
hc.wait(&m);
hq.erase(pthread_self());
m.unlock();
}
O() {
m.lock();
oq.insert(pthread_self());
if(hq.size() > 1 && !oq.empty()){
hc.signal();
hc.signal();
oc.signal();
}
oc.wait(&m);
oq.erase(pthread_self());
m.unlock();
}
w*****d
发帖数: 105
3
经过实测,上面的代码有点问题:pthread里如果没有线程wait,条件变量signal是没
有任何效果的。
下面的代码是测试通过的C++代码:
CMutex m;
CCondition hc, oc;
set hq, oq;
void * H(void * arg) {
bool w = true;
m.lock();
cout<<"generate H in "< hq.insert(pthread_self());
if(hq.size() > 1 && !oq.empty()){
hc.signal();
w = (hq.size() > 2);
if(w)
hc.signal();
oc.signal();
}
if(w)
hc.wait(m);
hq.erase(pthread_self());
cout<<"consume H in "< m.unlock();
return NULL;
}
void * O(void * arg) {
bool w = true;
m.lock();
cout<<"generate O in "< oq.insert(pthread_self());
if(hq.size() > 1 && !oq.empty()){
hc.signal();
hc.signal();
w = (oq.size() > 1);
if(w)
oc.signal();
}
if(w)
oc.wait(m);
oq.erase(pthread_self());
cout<<"consume O in "< m.unlock();
return NULL;
}
e***m
发帖数: 92
4
把consumer/producer的代码改一改应该就可以了

【在 G*********n 的大作中提到】
: 突然收到了linkedin的onsite通知,在后天,看了一下面经有一道题不会做,是多线程
: 的题,最好能给出java的解法。求各位大神指点,先谢谢了。题目是
: 实现两个函数: H() and O(), 这两个函数会被多线程调用。当一个线程调用H或O时
: ,如果当前已经有至少两个线程call H和一个线程call O。那么让两个call H和一个
: call O的线程返回(产生一个水分子),其他的都block。

G*********n
发帖数: 53
5
谢谢哈,不是很熟multithread programming

【在 w*****d 的大作中提到】
: 经过实测,上面的代码有点问题:pthread里如果没有线程wait,条件变量signal是没
: 有任何效果的。
: 下面的代码是测试通过的C++代码:
: CMutex m;
: CCondition hc, oc;
: set hq, oq;
: void * H(void * arg) {
: bool w = true;
: m.lock();
: cout<<"generate H in "<
G*********n
发帖数: 53
6
谢谢!

【在 e***m 的大作中提到】
: 把consumer/producer的代码改一改应该就可以了
w****a
发帖数: 710
7
C++11的
condition_variable gOReady, gHReady;
int atomcountH = 2, atomcountO = 1;
void O() {
unique_lock l(gLock);
gHReady.wait(l, []{return atomcountO > 0;});

cout << "O" << endl;
if(--atomcountO == 0 && atomcountH == 0) {
atomcountH = 2;
atomcountO = 1;
cout << "water" << endl;
}
gOReady.notify_all();
}
void H() {
unique_lock l(gLock);
gOReady.wait(l, []{return atomcountH > 0;});

cout << "H" << endl;
if(--atomcountH == 0 && atomcountO == 0) {
atomcountH = 2;
atomcountO = 1;
cout << "water" << endl;
}
gHReady.notify_all();
}
这个答案好使不
M******u
发帖数: 34
8
有没有大神给个java版。。
M******o
发帖数: 121
9
这个如何?
private static int NUM_OS = 1;
private static int NUM_HS = 2;
private Semaphore oS = new Semaphore(NUM_OS);
private Semaphore hS = new Semaphore(NUM_HS);
private Semaphore entryS = new Semaphore(1);
public YourClass() {
oS.drainPermits();
hS.drainPermits();
}
public void O() {
entryS.acquire();
if (!tryAcquire(oS)) {
if (canGenerateH2O()) {
releaseForH2O();
entryS.release();
} else {
entryS.release();
oS.aquire();
}
} else {
entryS.release();
}
// business logic.
}
public void H() {
entryS.acquire();
if (!tryAcquire(hS)) {
if (canGenerateH2O()) {
releaseForH2O();
entryS.release();
} else {
entryS.release();
hS.aquire();
}
} else {
entryS.release();
}
// business logic.
}
private void canGenerateH2O() {
return hS.availablePermits() == 0 && hS.getQueueLength() >= NUM_HS && oS
.availablePermits() == 0 && oS.getQueueLength() >= NUM_OS;
}
private void releaseForH2O() {
hS.release(NUM_HS);
oS.release(NUM_OS);
}

【在 M******u 的大作中提到】
: 有没有大神给个java版。。
m*****k
发帖数: 731
10
貌似一,两年前在本版见过, 当时也觉得P/C 改改就应该行吧
1 (共1页)
进入JobHunting版参与讨论
相关主题
昨天onsite被问到的 multithreading 题目C++ 实现读写锁的问题 (vmware电面考过)
人生中第一次面试问道多线程的简单题目
C++ Singleton的实现贡献T家新鲜面经,求个bless
multi thread复习请教哪里有mutex和semaphore例子?
read-write locker的实现一个多线程的题目,这个写法可以过关么
MITBBS 面试题第一题请问pure storage 的那道用spin lock and flags to implement mutex怎么做
pthread 编程还是要看看阿failed bloomberg phone interview
贡献一道湾区小公司的面试题 Medallia攒人品。面试经历(1)
相关话题的讨论汇总
话题: pthread话题: num话题: self话题: os话题: void