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);
}
上一篇 下一篇

猜你喜欢

热点阅读