直接考虑信号量解决问题。
输出完奇数偶数,释放输出0所需的信号量。
对于本题没有想到的地方是调用过程,原代码编写的没有自己加入for循环,以为三个线程会不停被调用。
一直不过,只输出“01”就结束了,根本没有循环起来。
#include <semaphore.h> class ZeroEvenOdd { private: int n; sem_t printOdd, printEven, numDone; public: ZeroEvenOdd(int n) { this->n = n; sem_init(&printOdd, 0, 0); sem_init(&printEven, 0, 0); sem_init(&numDone, 0, 1); } // printNumber(x) outputs "x", where x is an integer. void zero(function<void(int)> printNumber) { for (int i = 1; i <= n; ++i) { sem_wait(&numDone); printNumber(0); if (i % 2 == 0) { sem_post(&printEven); } else { sem_post(&printOdd); } } } void even(function<void(int)> printNumber) { for (int i = 2; i <= n; i += 2) { sem_wait(&printEven); printNumber(i); sem_post(&numDone); } } void odd(function<void(int)> printNumber) { for (int i = 1; i <=n; i += 2) { sem_wait(&printOdd); printNumber(i); sem_post(&numDone); } } };