leetcode H2O生成


leetcode1117 H2O生成

首先读题,输入是氢氧线程的顺序,然后输出的时候应该保证三个线程一组,在每组中必须有两个是氢线程,一个是氧线程。根据示例的输出

input: "HOH"
output: "HHO"

我们可以选择一种一致的策略,即先输出两个氢,再输出一个氧。我们用一个变量记录氢原子能够释放的个数记为h,当h > 0时,氢原子就可以释放,并h--;当 h == 0时, 氧原子就可以释放,并且h=2。弄清楚了ready条件,就可以套用条件变量的模板。代码如下:

class H2O {
private:
    mutex mtx;
    condition_variable cv;
    int h = 2;
public:
    H2O() {
    }

    void hydrogen(function<void()> releaseHydrogen) {
        //根据题目的意思我们选择释放两个H之后才允许释放一个O
        unique_lock<mutex> lck(mtx);
        cv.wait(lck, [this]{return h > 0;});
        releaseHydrogen();
        h--;
        cv.notify_all();
    }

    void oxygen(function<void()> releaseOxygen) {
        unique_lock<mutex> lck(mtx);
        cv.wait(lck, [this]{return h == 0;});
        releaseOxygen();
        h = 2;
        cv.notify_all();
    }
};

上次的总结有一点遗漏,就是这个unique_lock。unique_lock带mutex的构造函数会自动上锁,析构函数会自动解锁。所以我们不再需要显式地调用lock和unlock。

当然还有其它的做法,这种死板的策略估计也会降低并行度,只是这样刚好就是条件变量的模板,所以总结一下哈哈。


Author: 蒋璋
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source 蒋璋 !