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