多线程编程:交替打印字符串
#include "semaphore.h"
class FizzBuzz {
private:
int n;
int num;
sem_t signalNumber;
sem_t signalFizzBuzz;
sem_t signalFizz;
sem_t signalBuzz;
public:
FizzBuzz(int n) {
this->n = n;
this->num = 1;
sem_init(&signalNumber, 0, 0);
sem_init(&signalFizzBuzz, 0, 0);
sem_init(&signalFizz, 0, 0);
sem_init(&signalBuzz, 0, 0);
}
// printFizz() outputs "fizz".
void fizz(function<void()> printFizz) {
while (true) {
sem_wait(&signalFizz);
if (this->num > this->n) {
break;
}
printFizz();
turn();
}
}
// printBuzz() outputs "buzz".
void buzz(function<void()> printBuzz) {
while (true) {
sem_wait(&signalBuzz);
if (this->num > this->n) {
break;
}
printBuzz();
turn();
}
}
// printFizzBuzz() outputs "fizzbuzz".
void fizzbuzz(function<void()> printFizzBuzz) {
while (true) {
sem_wait(&signalFizzBuzz);
if (this->num > this->n) {
break;
}
printFizzBuzz();
turn();
}
}
// printNumber(x) outputs "x", where x is an integer.
void number(function<void(int)> printNumber) {
while (true) {
if (this->num > this->n) {
break;
}
printNumber(this->num);
turn();
sem_wait(&signalNumber);
}
}
// 递增当前数字, 并根据数值递增对应的信号量, 从而唤醒对应方法继续执行
void turn() {
++this->num;
// 特殊情况, 打印完了所有数字, 要唤醒所有的等待线程, 使它们退出循环
if (this->num > this->n) {
sem_post(&signalFizz);
sem_post(&signalBuzz);
sem_post(&signalFizzBuzz);
sem_post(&signalNumber);
} else {
if (this->num % 3 == 0) {
if (this->num % 5 == 0) {
sem_post(&signalFizzBuzz);
} else {
sem_post(&signalFizz);
}
} else if (this->num % 5 == 0) {
sem_post(&signalBuzz);
} else {
sem_post(&signalNumber);
}
}
}
};