三个进程互斥使用缓存区问题

    科技2024-11-04  12

    三个进程互斥使用缓存区问题

    问题

    三个进程P1、P2、P3互斥使用一个包含N(N>0)个单元的缓冲区。 P1每次用produce()生成一个正整数并用put()送入缓冲区某一空单元中; P2每次用getodd0从该缓冲区中取出一个奇数并用countodd0统计奇数个数; P3每次用geteven()从该缓冲区中取出一个偶数并用counteven()统计偶数个数。 试用信号量的P、V操作设计该问题的同步算法,给出所用共享变量(如果需要)和信号量及其初始值,并说明各自的含义。

    代码

    //伪代码 semaphore F = 1;//实现对缓冲区的互斥访问 int odd_num = 0;//奇数个数 int even_num = 0;//偶数个数 int N;//缓冲区单元数 P1() { while(1) { if(odd_num+even_num<N)//当缓冲区内有空单元 { P(F);//加锁 produce(); if (num_is_odd)//该数是奇数 { odd_num++;//奇数个数加1 } else//该数是偶数 { even_num++;//偶数个数加1 } put(); V(F);//解锁 } } } P2() { while (1) { if(odd_num>0)//当缓冲区内奇数大于零 { P(F); getodd(); odd_num=countodd(); V(F); } } } P3() { while (1) { if (odd_num > 0)//当缓冲区内偶数大于零 { P(F); geteven(); even_num = geteven(); V(F); } } }

    好像没什么障碍

    Processed: 0.020, SQL: 8