Leetcode刷题笔记题解(C++):1117. H2O 生成(多线程)

Leetcode刷题笔记题解(C++):1117. H2O 生成(多线程)_第1张图片

思路:

解法二:生产者-消费者解法
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 releaseHydrogen) {
        unique_lock 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 releaseOxygen) {
        unique_lock 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();
    }
};

你可能感兴趣的:(Leetcode算法题解,leetcode,笔记,c++)