forked from AnasImloul/Leetcode-Solutions
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPrint Zero Even Odd.cpp
42 lines (37 loc) · 1.08 KB
/
Print Zero Even Odd.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
class ZeroEvenOdd {
private:
int n;
mutex mx;
condition_variable cv;
atomic<int> num_to_print;
atomic<int> current;
public:
ZeroEvenOdd(int n) {
this->n = n;
num_to_print = 0;
current = 0;
}
// printNumber(x) outputs "x", where x is an integer.
void zero(function<void(int)> printNumber) {
do_work(printNumber, [&]{return num_to_print == 0;});
}
void even(function<void(int)> printNumber) {
do_work(printNumber, [&]{return num_to_print != 0 && num_to_print % 2 == 0;});
}
void odd(function<void(int)> printNumber) {
do_work(printNumber, [&]{return num_to_print % 2 != 0;});
}
protected:
void do_work(function<void(int)> print, function<bool()> eval)
{
while(current <= n)
{
unique_lock<mutex> ul(mx);
cv.wait(ul, [&]{return eval() || current > n;});
if(current > n) break;
print(num_to_print);
num_to_print = num_to_print == 0 || num_to_print == n ? ++current : 0;
cv.notify_all();
}
}
};