c++多线程交替输出
/*
写一个程序:
三个线程交替输出
输入一个数n,例如:
n=4,需要输出队列:01020304
n=5, 需要输出队列:0102030405
线程zero输出0,线程odd输出奇数,线程even输出偶数
注意线程zero一定要等其他两个线程先启动,否则就会出现死锁。
防止多输出0:当odd和even线程都退出了,就没必要继续输出了
*/
#include <bits/stdc++.h>
class Printer {
public:
Printer(int n) : n(n), i(1), start_odd(false), start_even(false) {}
void zero(std::function<void(int)> print) {
while (!(this->start_odd && this->start_even)) {
;
}
print(0);
while (true) {
if (i & 1) {
cv_odd.notify_one();
} else {
cv_even.notify_one();
}
{
std::unique_lock<std::mutex> lock(mtx);
cv_zero.wait(lock);
}
if (!start_even && !start_odd) {
break;
}
print(0);
}
};
void odd(std::function<void(int)> print) {
while (true) {
{
std::unique_lock<std::mutex> lock(mtx);
start_odd = true;
cv_odd.wait(lock);
}
if (i > n) {
cv_zero.notify_one();
break;
}
print(i);
i++;
cv_zero.notify_one();
if (i + 1 > n) {
start_odd = false;
break;
}
}
};
void even(std::function<void(int)> print) {
while (true) {
{
std::unique_lock<std::mutex> lock(mtx);
start_even = true;
cv_even.wait(lock);
}
if (i > n) {
cv_zero.notify_one();
break;
}
print(i);
i++;
cv_zero.notify_one();
if (i + 1 > n) {
start_even = false;
break;
}
}
};
private:
int n;
int i;
bool start_odd, start_even;
std::mutex mtx;
std::condition_variable cv_zero, cv_odd, cv_even;
};
void print_func(int x) {
std::cout << x;
}
int main() {
int n;
std::cin >> n;
Printer printer(n);
std::thread t1(&Printer::odd, &printer, print_func);
std::thread t0(&Printer::zero, &printer, print_func);
std::thread t2(&Printer::even, &printer, print_func);
t0.join();
t1.join();
t2.join();
return 0;
}