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 | |
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 改改就应该行吧 |