c*******7 发帖数: 438 | 1 题目是这样的:实现两个函数: 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 && hCount == 2) {
____________oCount = 0;
____________hCount = 0;
____________hSemaphore.release(2);
____________oSemaphore.release();
____________mutex.notifyAll();
________}
________else {
____________mutex.wait();
________}
____}
}
public void O() {
____oSemaphore.acquire();
____processO();
____
____synchronize(mutex) {
________oCount++;
________if(oCount == 1 && hCount == 2) {
____________oCount = 0;
____________hCount = 0;
____________hSemaphore.release(2);
____________oSemaphore.release();
____________mutex.notifyAll();
________}
________else {
____________mutex.wait();
________}
____}
} | d****n 发帖数: 12461 | | f**********t 发帖数: 1001 | 3 class H2O {
int _nH;
int _nO;
mutex _mx;
condition_variable _cv;
public:
H2O() : _nH(0), nO(0) {}
void H() {
unique_lock ul(_mx);
_cv.wait(ul, [](){_nH < 2;});
if (++_nH == 2 && _nO == 1) {
cout << "water ";
_nH = 0;
_nO = 0;
_cv.notify_all();
}
}
};
【在 c*******7 的大作中提到】 : 题目是这样的:实现两个函数: 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;
| h**********c 发帖数: 4120 | 4 下划线可以用regex replace 掉
^[_]+ | L*****1 发帖数: 34 | |
|