zoukankan      html  css  js  c++  java
  • 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
    请按任意键继续. . .
  • 相关阅读:
    JS入门(二)
    JavaScript中冒泡排序
    JS入门(一)
    页面的编写(二)
    页面的编写(一)
    编写页面之前的准备
    2019 ICPC徐州网络赛 K.Center
    2019 ICPC徐州网络赛 B.so easy(unordered_map)
    2018-2019 ICPC焦作区域赛B
    2019南昌ICPC网络赛 H.The Nth Item(矩阵快速幂+欧拉降幂+数学处理)
  • 原文地址:https://www.cnblogs.com/junfblog/p/12765868.html
Copyright © 2011-2022 走看看