Linux系统编程——使用semaphore实现进程同步

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/wait.h>
#include <semaphore.h>

/**			-> C -> E ->
  * A -> B					F
  * 		-> D ----->
*/

sem_t *sem_A;
sem_t *sem_B;
sem_t *sem_C;
sem_t *sem_D;
sem_t *sem_E;
sem_t *sem_F1;
sem_t *sem_F2;

void P(sem_t *sem) {
    sem_wait(sem);
}

void V(sem_t *sem) {
    sem_post(sem);
}

void task_A() {
    P(sem_A);
    printf("Start task A...\n");
    sleep(rand()%5+1);
    printf("Task A finished!\n");
    V(sem_B);
}

void task_B() {
    P(sem_B);
    printf("Start task B...\n");
    sleep(rand()%5+1);
    printf("Task B finished!\n");
    V(sem_C);
    V(sem_D);
}

void task_C() {
    P(sem_C);
    printf("Start task C...\n");
    sleep(rand()%5+1);
    printf("Task C finished!\n");
    V(sem_E);
}

void task_D() {
    P(sem_D);
    printf("Start task D...\n");
    sleep(rand()%5+1);
    printf("Task D finished!\n");
    V(sem_F1);
}

void task_E() {
    P(sem_E);
    printf("Start task E...\n");
    sleep(rand()%5+1);
    printf("Task E finished!\n");
    V(sem_F2);
}

void task_F() {
    P(sem_F1);
    P(sem_F2);
    printf("Start task F...\n");
    sleep(4);
    printf("Task F finished!\n");
    V(sem_F1);
    V(sem_F2);
}

int main(int argc, char *argv[]) {
    int pageSize = sysconf(_SC_PAGE_SIZE);
    void *addr = mmap(NULL, pageSize * 1, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, 0, 0);

    sem_t *sems = (sem_t *)addr;

    sem_A = &sems[0];
    sem_B = &sems[1];
    sem_C = &sems[2];
    sem_D = &sems[3];
    sem_E = &sems[4];
    sem_F1 = &sems[5];
    sem_F2 = &sems[6];

    int i;
    for (i = 0; i < 7; i++) {
        sem_init(&sems[i], 1, 0);
    }

    V(sem_A);

    if (0 == fork()) {
        task_A();
        _exit(0);
    } else {
        wait(NULL);
    }
    if (0 == fork()) {
        task_B();
        _exit(0);
    } else {
        wait(NULL);
    }
    if (0 == fork()) {
        task_C();
        _exit(0);
    } else {
        wait(NULL);
    }
    if (0 == fork()) {
        task_D();
        _exit(0);
    } else {
        wait(NULL);
    }
    if (0 == fork()) {
        task_E();
        _exit(0);
    } else {
       wait(NULL);
    }
    if (0 == fork()) {
        task_F();
        _exit(0);
    } else {
        wait(NULL);
    }

    printf("All task finished!\n");

    exit(0);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值