思路:
解法二:生产者-消费者解法
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();}
};