力扣1116. 打印零与奇偶数(信号量)
https://leetcode-cn.com/problems/print-zero-even-odd/
信号量
解题思路
有几个线程就用几个信号量,最先开始的信号量初始化为1,其他初始化为0,然后根据条件判断实现同步
#include <semaphore.h>
class ZeroEvenOdd {
private:
int n;
sem_t zerojob;
sem_t evenjob;
sem_t oddjob;
public:
ZeroEvenOdd(int n) {
this->n = n;
sem_init(&zerojob,0,1);
sem_init(&evenjob,0,0);
sem_init(&oddjob,0,0);
}
// printNumber(x) outputs "x", where x is an integer.
void zero(function<void(int)> printNumber) {
for (int i = 1; i <= n; i++) {
sem_wait(&zerojob);
// printFoo() outputs "foo". Do not change or remove this line.
printNumber(0);
if(i&1==0)
{
sem_post(&evenjob);
}
else
{
sem_post(&oddjob);
}
}
}
void even(function<void(int)> printNumber) {
for (int i = 2; i < n; i=i+2) {
sem_wait(&evenjob);
// printFoo() outputs "foo". Do not change or remove this line.
printNumber(i);
sem_post(&zerojob);
}
}
void odd(function<void(int)> printNumber) {
for (int i = 1; i < n; i=i+2) {
sem_wait(&oddjob);
// printFoo() outputs "foo". Do not change or remove this line.
printNumber(i);
sem_post(&zerojob);
}
}
};