美文网首页
C语言信号量实现线程通信

C语言信号量实现线程通信

作者: NullUser | 来源:发表于2020-08-10 09:03 被阅读0次
#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);
}

相关文章

网友评论

      本文标题:C语言信号量实现线程通信

      本文链接:https://www.haomeiwen.com/subject/dseddktx.html