关于这个经典的进程同步问题,我在上面没有放出来这个导图,因为无非就是生产者消费者模型,读者写者模型和我们的哲学家就餐的这个问题,主要是在题目里面理解吧;
这些答题基本上都是PV操作相关的大题:
1)在这个问题里面P1就是我们的生产者,P2,P3就是我们的这个消费者只不过两个的这个区别就是消费的这个对象是不一样的,一个是奇数,一个是偶数;
2)首先我们需要知道这个缓冲区是一个互斥的,因此这个里面到时候写代码的时候就需要设置这个互斥信号量mutex,我们的这个生产者和消费者是没有办法对于这个缓冲区里面的资源进行同时访问的,通俗的说就是我们的这个put操作的时候是被这个mutex夹着的;
3)对于这个消费者里面的区别,就是奇数和偶数,我们需要进行判断,看看是哪一个消费者进行消耗;
4)P1,P2,P3共享缓冲区,因此这个里面需要设置一个同步信号量empty表示我们的这个缓冲区的大小;
5)相关的上述信号量的定义:
6)下面的这个就是我上面说的这个生产者放进去的时候被我们的mutex互斥信号量夹着,生产的时候需要申请这个资源,因此,这个p(empty)表示的就是申请这个缓冲区里面的空位,如果没有空位,这个时候就会阻塞;
如果是偶数,v一下,表示我们的缓冲区里面多了一个偶数;
反之,在这个缓冲区里面多一个奇数,也就是v(odd);
7)消费者对于这个缓冲区的访问也是互斥的,因此这个也需要进行pvmutex的这个操作;
p(odd)表示的就是我们的这个消费者消费的过程,消费之后我们的这个缓冲区就会有新的空间,因此这个需要进行v(empty)的操作,并且计算这个具体的数量,调用这个countodd函数;
8)下面的这个是一样的操作,夹着一个pvmutex,消费之后v一下我们的这个缓冲区,消费的时候就是p(even)表示消耗我们的这个缓冲区里面的偶数;
9)总结:P1,P2,P3都有的就是我们的这个p(mutex)和我们的v(mutex)表示的就是我们的这个操作是一个互斥的操作;
P1生产,需要p(empty)就是消耗缓冲区空位,奇数的话,就是v奇数,偶数的话就是v偶数;
P2,P3除了pvmutex,消耗偶数使用p操作,结束的时候添加这个v表示多出新的空格,最后使用个自己的这个函数统计即可;
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。