m*v 发帖数: 6 1
是不是和blockingqueue一个道理啊?
用一个data structure去coordinate两个threads?
public class H2O {
private int hCount;
private int oCount;
public H2O() {
hCount = 0;
oCount = 0;
}
public synchronized void addH() throws InterruptedException {
if(hCount == 2 && oCount == 1) {
System.out.println("add H, H2O");
hCount = 0;
oCount = 0;
notifyAll();
}
else {
while(hCount == 2) {
Syste... 阅读全帖
K********y 发帖数: 47 2
(原贴见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... 阅读全帖
K********y 发帖数: 47 3
(原贴见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... 阅读全帖
t*q 发帖数: 104 4
你自己已经回答了自己的问题,你的程序可以简化:
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... 阅读全帖
c*******7 发帖数: 438 5
题目是这样的:实现两个函数: H() and O(), 这两个函数会被多线程调用。如果满足
当前2个线程调用H(),和1个线程调用O(),让以上3个线程返回,产生一个水分子(可能
是HHO,HOH,OHH)。调用H()的当前线程不能大于2,调用O()的当前线程不能大于1。
我思前想后,写了一个,请大家帮忙看看。(排版有问题,tab改成下划线了。。。)
(发现前面写的好像不太对,又改了一次)
private Object mutex = new Object;
private Semaphore hSemaphore = new Semaphore(2);
private Semaphore oSemaphore = new Semaphore(1);
private int hCount;
private int oCount;
public void H() {
____hSemaphore.acquire();
____processH();
____
____synchronize(mutex) {
________hCount++;
________if(oCount == 1... 阅读全帖
D**C 发帖数: 6754 6
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.atomic.AtomicInteger;
public class H2O {
//using blocking queue, so it's easy to just have 2 h and 1 o at most,
//other threads will be blocked.
ArrayBlockingQueue hQueue = new ArrayBlockingQueue(2);
ArrayBlockingQueue oQueue = new ArrayBlockingQueue(1);
AtomicInteger hCount = new AtomicInteger();
AtomicInteger h2oCount= new AtomicInteger();
AtomicInteger hPrintCount= new AtomicInteger();
... 阅读全帖