marquee
  • 2018上半年将更新数据库、C++、计算机组成原理、操作系统等文章,谢谢关注~
  • 由于算法限制,搜索时注意简化关键字,谢谢支持~
  • 网站不兼容IE5.0及以下,请使用主流浏览器访问.
  • 试用搜索、标签、分类目录功能发现更多。
  • 生产者与消费者问题C语言实现

    实验目的

    ①实现生产者—消费者问题的模拟,以便更好的理解此经典进程同步问题。生产者-消费者问题是典型的PV操作问题,假设系统中有一个比较大的缓冲池,生产者的任务是只要缓冲池未满就可以将生产出的产品放入其中,而消费者的任务是只要缓冲池未空就可以从缓冲池中拿走产品。缓冲池被占用时,任何进程都不能访问。

    ②每一个生产者都要把自己生产的产品放入缓冲池,每个消费者从缓冲池中取走产品消费。在这种情况下,生产者消费者进程同步,因为只有通过互通消息才知道是否能存入产品或者取走产品。他们之间也存在互斥,即生产者消费者必须互斥访问缓冲池,即不能有两个以上的进程同时进行。

    实验原理

    在同一个进程地址空间内执行两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放一个空缓冲区。当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻挡,直到新的物品被生产出来。

    生产者流程图

    消费者流程图

    注意点

    ①本次实验是关于生产者与消费者之间互斥和同步的问题。问题的是指是P、V操作,实验设一个共享缓冲区,生产者和消费者互斥的使用,当一个线程使用缓冲区的时候,另一个让其等待直到前一个线程释放缓冲区为止。
    ②生产者与消费者是一个与现实有关的经验问题,通过此原理举一反三可以解决其他类似的问题。 通过本实验设计,我们对操作系统的P、V进一步的认识,深入的了解P、V操作的实质和其重要性。课本的理论知识进一步阐述了现实中的实际问题。
    ③Linux环境下编写变异C语言有Windows稍有不同,注意在Linux中编译带有线程<pthread.h>头文件的源程序需要加上参数-lpthread
    并且如果要在Linux控制台输出中文还得更改为utf-8编码。
    ④在编写生产者消费者函数的时候,最好把P、V操作整体嵌入其中,不必在另外设置函数体。否则,如果像:
    Semaphore mutex=1//此时mutex为全局变量
    如果在生产者(消费者)函数体中这样写:
    Producer()
    {
    ……
    Wait(mutex);
    ……
    }
    此时根本无法改变全局变量的值,即mutex值没有变。
    如果非要用函数,则需要对每个信号量设置一个P函数,一个V函数或者不对mutex设为全局变量。

    代码

    结果

    读者评分
    [评分人数: 3 平均分: 5]

    评论

    OmegaXYZ