思路:
解法二:生产者-消费者解法
1.把 hydrogen 线程看作生产者,oxygen 线程看作消费者,缓冲队列大小为2。
2.hydrogen 把生成的氢放入队列;oxygen 线程每次从队列里消费两个氢元素。
3.生产者生产两个氢元素后会因为缓冲队列满而阻塞,使用条件变量使生产者阻塞。
4.消费者只有当缓冲队列满时才会从缓冲队列中消费元素,缓冲队列未满时消费者阻塞。
5.当生产者生成的氢元素填满缓冲队列时,生产者唤醒被阻塞的消费者;当消费者消费掉缓冲队列的元素后,消费者唤醒被阻塞的生产者。
6.由于不需要对队列中的氢元素做操作,我们只需维护缓冲队列的大小即可。
class H2O {
public:
mutex mtx;
condition_variable cv;
int cnt_h;
H2O() {
}
void hydrogen(function<void()> releaseHydrogen) {
unique_lock<mutex> lock(mtx);
cv.wait(lock,[this]{return this->cnt_h<2;});
// releaseHydrogen() outputs "H". Do not change or remove this line.
releaseHydrogen();
cnt_h++;
cv.notify_all();
}
void oxygen(function<void()> releaseOxygen) {
unique_lock<mutex> lock(mtx);
cv.wait(lock,[this]{return this->cnt_h==2;});
// releaseOxygen() outputs "O". Do not change or remove this line.
releaseOxygen();
cnt_h=0;
cv.notify_all();
}
};