分别在windows和linux下用信号量解决生产者消费者问题

用信号量解决生产者消费者问题

                                     

  1. 实验目的

      通过实验,掌握Windows和Linux环境下互斥锁和信号量的实现 方法,加深对临界区问题和进程同步机制的理解,同时熟悉利用Windows API和Pthread API进行多线程编程的方法。

  2. 实验内容

      1.  在Windows操作系统上,利用Win32 API提供的信号量机制,编写应     用程序实现生产者——消费者问题。

      2.  在Linux操作系统上,利用Pthread API提供的信号量机制,编写应用程序实现生产者——消费者问题。

      3.  两种环境下,生产者和消费者均作为独立线程,并通过empty、full、mutex三个信号量实现对缓冲进行插入与删除。

      4.  通过打印缓冲区中的内容至屏幕,来验证应用程序的正确性。

  3. 实验步骤及运行结果和数据说明

      (a)windows下用win32API实现

         1.windows下建立多线程,分别表示生产者和消费者,首先引用   

    分别用来建立线程和引用windows下的函数

      

    创建两个线程,分别用来表示生产者和消费者。

     

    线程的表示函数 consumer和produce

  1. main函数的实现

      

    建立线程并关闭线程

  2. 变量的声明

      

      声明三个信号量emp,full,mutex初值分别为20,0,1

  3. 生产者消费者的实现

      生产者:

       

    做20次循环,每次生产一个,同时empty-1,full+1,mutex保持每次生产的互斥。

     消费者:

     

     同样也是20个消费者,但只有full>1时才能进行。

     

  1. 实验运行结果

        

     

    blinux下用pthread实现

    1.首先是linux下多线程的创建,需要引用pthread.h

     同时创建函数为 pthread_creat()

     

     

    我们创建了生产者和消费者两个线程,名字分别为cunsumer和producer

       2. 信号量的声明

         

         在这里,互斥信号量the_mutex用pthread_mutex_t创建,同步信号量                  用sem_t创建

         信号量的初始:

         

       3. 生产者和消费者函数的具体实现

         生产者:

      

      Sem_wait进行信号量的减一操作,sem_post进行信号量的加一操作

      Pthread_mutex_lock则相应的对互斥信号量进行操作

      消费者:

      

    与生产者类似,不过每次消费时,必须先判断full>0,只有大于0时才能消费

     

  • 3
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
生产者消费者问题是一个经典的同步问题,其中有多个生产者和消费者共享一个有限的缓冲区。在这个问题中,生产者要将数据放入缓冲区中,而消费者要从缓冲区中取出数据。为了避免竞争条件和死锁问题,需要使用信号量来进行同步和互斥。 信号量是一种用于进程间同步的机制,它可以用来实现互斥锁和条件变量。在生产者消费者问题中,我们可以使用两个信号量解决同步问题:一个信号量用于表示缓冲区中可用的空间数量,另一个信号量用于表示缓冲区中已经被填充的数据数量。 当生产者想要将数据放入缓冲区时,它需要先获取空间信号量,如果空间信号量的值为0,则表示缓冲区已满,生产者需要等待消费者从缓冲区中取出数据后再进行生产。当生产者成功获取空间信号量后,它可以将数据放入缓冲区中,并且需要释放数据信号量的值加1,表示缓冲区中已经有了一个新的数据。 当消费者想要从缓冲区中取出数据时,它需要先获取数据信号量,如果数据信号量的值为0,则表示缓冲区为空,消费者需要等待生产者将数据放入缓冲区后再进行消费。当消费者成功获取数据信号量后,它可以从缓冲区中取出数据,并且需要释放空间信号量的值加1,表示缓冲区中又有了一个可用的空间。 通过信号量的机制,生产者和消费者之间可以进行同步和互斥,避免了竞争条件和死锁问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值