class ZeroEvenOdd {
private:
int n;
mutex m_mutex;
condition_variable m_cnv;
bool m_zero; //打印0
bool m_odd; //打印奇数
public:
ZeroEvenOdd(int n) {
this->n = n;
m_zero = true;
m_odd = true;
}
// printNumber(x) outputs "x", where x is an integer.
void zero(function<void(int)> printNumber) {
for (int i = 0; i < n; i++)
{
unique_lock<mutex> locker(m_mutex);
m_cnv.wait(locker, [this] {return this->m_zero;});
printNumber(0);
m_zero = false;
m_cnv.notify_all();
}
}
//偶数
void even(function<void(int)> printNumber) {
for (int i = 2; i <= n; i++)
{
if (i % 2 != 0)
continue;
unique_lock<mutex> locker(m_mutex);
m_cnv.wait(locker, [this] {return !this->m_zero && !m_odd;});
printNumber(i);
m_zero = true;
m_odd = true;
m_cnv.notify_all();
}
}
//奇数
void odd(function<void(int)> printNumber) {
for (int i = 1; i <= n; i++)
{
if (i % 2 == 0)
continue;
unique_lock<mutex> locker(m_mutex);
m_cnv.wait(locker, [this] {return !this->m_zero && this->m_odd;});
printNumber(i);
m_zero = true;
m_odd = false;
m_cnv.notify_all();
}
}
};