有这样一个题目要求多个生产者和多个消费者之间,1,3,5,7,9号生产者供所有奇数号消费者消费,当所有奇数号消费完之后,该消息可撤销。
2,4,6,8,10号生产者供所有偶数号消费者消费,任一消费者消费该信息之后,该消息可撤销。
该怎么做呢?求高人指点
直接寄奇数生产者类和偶数生产者类。把消费品作为list<消费者>成为这两个类的属性。判断传进来的号码。如果传进来的奇数号则消费奇数生产者中的消费品,否则消费偶数生产者中的消费号。
这个,感谢楼上的回复,但你说的包括类和属性,应该是c++把,我们要用c来写。
我不明白的是撤销消息是不是说该编号的生产者不再生产产品?一个消费者应该是只运行一次是吧?那奇数号的要求就是说所有要等到所有奇数号消费者消费完之后生产者再撤销,而不是说都消费该同一编号的生产者?
还有就是因为线程竞争和并发的原因,生产者消费者运行的顺序是不能控制的,这个题目是要等所有生产者生产完之后,消费者再根据要求去消费吗?
希望能说的详细一点,万分感谢!
@尘_: 我理解的撤销是过如果没有消费品了。那就请求消费就不成功,也就是再提供消费了。我很奇怪这题目,消费者不是应该消费产品,怎么会消费生产者呢?生产者不是生产产品的吗。
多线程问题你就要锁住消费者消费的过程了。
这题目问题很多啊。我的疑问除了上面的,还有就是生产者是什么条件下才会生产产品的,还是一开始就生产好了的?我另外这个问题我记得大学的时候可以用循环队列来解决。操作系统中有讲到pv操作,你可以去搜一下
@饮鸩止渴:很感谢你的解答,是我写的问题不准确的问题,产生歧义了,那题目是说生产者生产产品,消费者消费产品并存储结果。1,3。。。号生产者的产品供奇数号消费者消费,所有奇数号消费者消费之后,该产品才能从缓冲区撤销。
这样说如果你有思路的话,还请告诉我。其实我想的是因为运行的时候生产者,消费者顺序是交叉错乱的,好比说1号消费者在5号生产者之前运行了,那不就不能消费5号生产者的产品了,所以说需要用sleep函数实现生产者全都生产完之后再运行消费者,消费者根据生产者编号进行消费,这样对吗?
@尘_: 这样吧,设两个循环队列。头指针为生产者,尾指针为消费者。如果是奇数生产者生产,那么奇数队列头部++;如果是偶数生产者生产的,那么偶数队列头部++;奇数消费者消费,则奇数消费者指针++,否则偶数队列++;这样不会有多线程问题
@饮鸩止渴: 好的,非常感谢!