【摘要】:在生产/消费者模型初始化时,Flag和Status位都为0,之后生产者和消费者通过操纵和检测Flag和Status位,进行数据传递。表11-2 生产/消费者的工作流程由以上描述,可以发现生产者仅轮询Status位,在条件允许时将该位清零,而直接对Flag位写1;消费者仅轮询Flag位,并在条件允许时将该位清零,而直接对Status位写1。由此可见,生产/消费者模型的正确运行是有条件的。而且这个“序”需要考虑在一个系统中存在多个生产者、多个消费者和多个数据缓冲的情况。
在生产/消费者模型初始化时,Flag和Status位都为0,之后生产者和消费者通过操纵和检测Flag和Status位,进行数据传递。其中生产者负责将数据填入到数据缓冲中,而消费者负责将数据从缓冲中取出,其实现过程如表11-2所示。
表11-2 生产/消费者的工作流程
由以上描述,可以发现生产者仅轮询Status位,在条件允许时将该位清零,而直接对Flag位写1;消费者仅轮询Flag位,并在条件允许时将该位清零,而直接对Status位写1。
设计者在使用生产/消费者模型时,需要注意两个竞争条件。(www.chuimin.cn)
(1)由于生产者对“Flag位置1”和“数据写入数据缓冲”可能没有采用相同的路径,因此这两个动作不一定同步进行。当生产者将Flag位置1时,可能数据没有完全写入到缓冲中。但是在消费者查询Flag位已经为1,并将该位清零之后,数据一定要写入缓冲中,否则消费者将得到无效数据。
(2)消费者对“数据从缓冲读出”和“Status位置1”也可能没有采用相同的路径,这两个动作也不一定同步。因此消费者将Status位置1时,可能数据没有完全从缓冲中读出。但是在生产者查询Status位已经为1,并将该位清零之后,数据一定要从缓冲读出,否则生产者将会清除缓冲中的有效数据。
由此可见,生产/消费者模型的正确运行是有条件的。为此在一个实际的系统应用中,必须合理安排数据访问的“序”,使得该模型能够正常运转。而且这个“序”需要考虑在一个系统中存在多个生产者、多个消费者和多个数据缓冲的情况。
相关推荐