• PV操作——实力模型2


    题目详情:

    临界资源:一个盘子盘子

    四个进程:

    ①父亲进程,生产苹果

    ②母亲进程:生产橘子

    ③儿子进程:吃苹果

    ④女儿进程:吃橘子

    程序源码:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <pthread.h>
    #include<semaphore.h>
    
    #define P sem_wait    // sem_post函数的作用是给信号量的值加上一个“1”
    #define V sem_post     // sem_wait函数也是一个原子操作,它的作用是从信号量的值减去一个“1”,但它永远会先等待该信号量为一个非零值才开始做减法。
    #define full_apple &full_realA
    #define full_orange &full_realB
    #define empty &empty_real
    
    sem_t full_realA;//苹果 
    sem_t full_realB;//橘子 
    sem_t empty_real;//盘子 
    
    int num=0; 
    
    void* Mom(void *p)
    {
        while(num<50){
            P(empty);
            num++; 
            printf("妈妈放了橘子%d
    ",num);
            V(full_orange);
        }
    }
    
    void* Father(void *p)
    {
            while(num<50){
            P(empty);
            num++; 
            printf("爸爸放了苹果%d
    ",num);
            V(full_apple);
        }
    }
    
    void* Son (void *p)
    {
        while(num<50)
        {
            P(full_apple);
            num++;
            printf("儿子吃了苹果%d
    ",num);
            V(empty);    
        }
     } 
    
    void* Daughter(void *p)
    {
        while(num<50)
        {
            P(full_orange);
            num++;
            printf("女儿吃了橘子%d
    ",num);
            V(empty);    
        }
     } 
     
    int main()
    {
        
         //sem_init(sem_t *sem,int pshared,unsigned int value); 
         //sem:信号量指针, pshared:shared不为0时此信号量在进程间共享,否则只能为当前进程的所有线程共享 value:信号量初值 
        sem_init(full_apple, 0, 0); 
        sem_init(full_orange, 0, 0);    
        sem_init(empty, 0, 1);   
     
        pthread_t tid0;
        pthread_t tid1;
        pthread_t tid2;
        pthread_t tid3;
        
        //pthread_create((pthread_t  *thread,  pthread_attr_t  *attr,  void  *(*start_routine)(void  *),  void  *arg)
        /*
        thread:线程标识符;
        attr:线程属性设置;
        start_routine:线程函数的起始地址;
        arg:传递给start_routine的参数;
        */
        pthread_create(&tid0, NULL, Father, NULL);
        pthread_create(&tid1, NULL, Mom, NULL);
        pthread_create(&tid2, NULL, Son, NULL);
        pthread_create(&tid2, NULL, Daughter, NULL);
    
        pthread_exit(0);
    }

    运行结果:(不唯一,父亲和儿子进程;母亲和女儿进程成对出现,但并不一定交叉出现,有可能存在出现两次父亲、儿子进程)

    爸爸放了苹果1
    儿子吃了苹果2
    妈妈放了橘子3
    女儿吃了橘子4
    爸爸放了苹果5
    儿子吃了苹果6
    妈妈放了橘子7
    女儿吃了橘子8
    爸爸放了苹果9
    儿子吃了苹果10
    妈妈放了橘子11
    女儿吃了橘子12
    爸爸放了苹果13
    儿子吃了苹果14
    妈妈放了橘子15
    女儿吃了橘子16
    爸爸放了苹果17
    儿子吃了苹果18
    妈妈放了橘子19
    女儿吃了橘子20
    爸爸放了苹果21
    儿子吃了苹果22
    妈妈放了橘子23
    女儿吃了橘子24
    爸爸放了苹果25
    儿子吃了苹果26
    妈妈放了橘子27
    女儿吃了橘子28
    爸爸放了苹果29
    儿子吃了苹果30
    妈妈放了橘子31
    女儿吃了橘子32
    爸爸放了苹果33
    儿子吃了苹果34
    妈妈放了橘子35
    女儿吃了橘子36
    爸爸放了苹果37
    儿子吃了苹果38
    妈妈放了橘子39
    女儿吃了橘子40
    爸爸放了苹果41
    儿子吃了苹果42
    妈妈放了橘子43
    女儿吃了橘子44
    爸爸放了苹果45
    儿子吃了苹果46
    妈妈放了橘子47
    女儿吃了橘子48
    爸爸放了苹果49
    儿子吃了苹果50
    妈妈放了橘子51
    女儿吃了橘子52
    爸爸放了苹果53
    
    --------------------------------
    Process exited after 0.4719 seconds with return value 53
    请按任意键继续. . .
  • 相关阅读:
    Redpine的Lite-Fi解决方案获Wi-Fi CERTIFIED认证
    植物园偶遇一直喵
    美食篇
    端午节路过南站
    黄山云海
    一品黄山 天高云淡
    黄山的日出日落
    宏村,寻找你的前世今生
    git把本地文件上传到github上的步骤
    一张照片一个故事
  • 原文地址:https://www.cnblogs.com/junfblog/p/12765868.html
Copyright © 2020-2023  润新知