题目:https://leetcode-cn.com/problems/print-zero-even-odd/submissions/
用三个互斥锁控制打印0,奇数,偶数的顺序。
每把锁控制一种打印。
打印0后,如果是偶数,则释放奇数锁,即开始打印奇数。反之,释放偶数锁。
打印奇数后,释放0锁;
打印偶数后,释放0锁。
class ZeroEvenOdd {
private:
int n;
std::mutex mux1;//0锁
std::mutex mux2;//偶数锁
std::mutex mux3;//奇数锁
public:
ZeroEvenOdd(int n) {
this->n = n;
mux2.lock();
mux3.lock();
}
// printNumber(x) outputs "x", where x is an integer.
void zero(function<void(int)> printNumber) {
for (int i=0; i<n ; ++i) {
mux1.lock();
printNumber(0);
if (i&1) {//奇数
mux2.unlock();
} else {
mux3.unlock();
}
}
}
void even(function<void(int)> printNumber) {
for (int i=2; i<=n; i=i+2) {
mux2.lock();
printNumber(i);
mux1.unlock();
}
}
void odd(function<void(int)> printNumber) {
for (int i=1; i<=n; i=i+2) {
mux3.lock();
printNumber(i);
mux1.unlock();
}
}
};