C语言信号量实现线程通信
2020-08-10 本文已影响0人
NullUser
#include <semaphore.h>
typedef struct {
int n;
sem_t zeroSem;
sem_t oddSem;
sem_t evenSem;
} ZeroEvenOdd;
ZeroEvenOdd* zeroEvenOddCreate(int n) {
ZeroEvenOdd* obj = (ZeroEvenOdd*) malloc(sizeof(ZeroEvenOdd));
obj->n = n;
sem_init(&obj->zeroSem, 0, 0);
sem_init(&obj->oddSem, 0, 0);
sem_init(&obj->evenSem, 0, 0);
sem_post(&obj->zeroSem);
return obj;
}
// You may call global function `void printNumber(int x)`
// to output "x", where x is an integer.
void zero(ZeroEvenOdd* obj) {
int i = 0;
for(i = 1; i <= obj->n; i++)
{
sem_wait(&obj->zeroSem);
printNumber(0);
if((i%2) == 0)
{
sem_post(&obj->evenSem);
}
else
{
sem_post(&obj->oddSem);
}
}
}
void even(ZeroEvenOdd* obj) {
int i = 0;
for(i = 1; i <= obj->n; i++)
{
if(i%2 != 0)
continue;
sem_wait(&obj->evenSem);
printNumber(i);
sem_post(&obj->zeroSem);
}
}
void odd(ZeroEvenOdd* obj) {
int i = 1;
for(i = 1; i <= obj->n; i++)
{
if(i%2 == 0)
continue;
sem_wait(&obj->oddSem);
printNumber(i);
sem_post(&obj->zeroSem);
}
}
void zeroEvenOddFree(ZeroEvenOdd* obj) {
sem_destroy(&obj->zeroSem);
sem_destroy(&obj->oddSem);
sem_destroy(&obj->evenSem);
}