关闭

线程同步之生产者-消费者问题

标签: c语言线程并发semaphore
401人阅读 评论(0) 收藏 举报
分类:

生产者-消费者问题(The Producer-Consumer Problem)是并发处理中最常见的一类同步抽象描述。先考虑但缓冲区的情况:有一个生产者进程P和一个消费者进程C公用一个缓冲区,P生产产品放入缓冲区,C从缓冲区取产品来消费。

同步问题:P进程不能往“满”的缓冲区中放入产品,C进程不能从“空”的缓冲区中取产品。

互斥问题:缓冲区不能同时被P和C使用。

解决方法:设置两个信号量full,empty,full表示缓冲区是否有产品,初值为0,empty表示缓冲区是否为空,初值为1.

1、解决单缓冲区生产者-消费者问题的描述如下:

struct semaphore
{
int value;
pointer_PCB quene;
}
semaphore S;

semaphore empty = 1;

semaphore full = 0;

main()

{

cobegin

    producer();

   consumer();

coend();

}

生产者-消费者进程描述如下:

void producer()                                                            void consumer()

{                                                                                    {

   while(true)                                                                     while(true)

     {                                                                                           {

       生产一个产品;                                                                  P(fulll);

       P(empty);                                                                        从缓冲区去产品;

      送产品到缓冲区;                                                                V(empty);

      V(full);                                                                               消费产品;

     }                                                                                             }

}                                                                                           }

2、考虑多个缓冲区的情况:设有若干个生产者进程P1,P2,···,Pn,若干个消费者进程C1,C2,···,Cm,它们通过一个缓冲池(由k个缓冲区组成)联系起来,如图所示

                                                                        

设每个缓冲区存放一个“产品”,生产者进程不断的生产产品,并把它们放入到缓冲池中,消费者进程不断的从缓冲池中取出产品并消费。

同步问题:当缓冲池已经放满了产品时,生产者进程必须等待;当缓冲池已空时,消费者进程必须等待

互斥问题:互斥存在于所有进程之间,所有进程应互斥使用缓冲池这一临界资源

为了了解生产者-消费者问题,需设置若干信号量:full,empty,mutex.其中mutex是互斥信号量,用于对缓冲池这一临界资源的互斥访问;full,empty是同步信号量,分别表示缓冲池满和空的数量。

void main()

{

 int full(0),empty(0),mutex(1);

int in = out = 0;

buffer[n];

cobegin

   producer();

   consumer();

coend

}

void producer()

{

   while(true)

     {

        ···

        Producer an item in nextp;//生产一件产品

       ···

        P(empty);

        P(mutex);

        buffer[in] = nextp;//向缓冲区存放一件产品

        in = (in +1)%n;

        V(mutex);

        V(full);

      }

}

void consumer()

{

   while(true)

     {

         P(full);

         P(mutex); 

         nextc = buffer[out];//从缓冲区取走一件产品

         out = (out+1)%n;

         V(mutex);

         V(empty);

        consumer the item nextc;//消费一件产品

     }

}

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

进程间同步互斥经典问题(一)生产者-消费者问题

问题描述:生产者-消费者问题,也叫做缓存绑定问题(bounded-buffer),是一个多进程同步问题。 即有两个进程:制造少和消费者,共享一个固定大小的缓存 制造商的工作是制造一段数据...
  • qq_24451605
  • qq_24451605
  • 2015-11-01 22:11
  • 3081

【线程同步】java实现生产者消费者问题与线程中的wait与notify总结

JAVA解决线程模型有三种方式,只讲一种:   1、wait()和notify()
  • robert_lizhiqiang
  • robert_lizhiqiang
  • 2014-09-15 14:41
  • 1111

使用Win32 API实现生产者消费者线程同步

#include #include #define QUEUE_LENGTH 10 //缓冲区长度 HANDLE full_sem; //满信号量 HANDLE empty_sem; //空...
  • giantpoplar
  • giantpoplar
  • 2015-07-23 16:47
  • 1560

线程同步(生产者--消费者问题)

  • 2013-08-18 20:46
  • 42KB
  • 下载

线程同步--生产者消费者问题

  • 2009-07-05 22:15
  • 5KB
  • 下载

多线程代码 经典线程同步互斥问题 生产者消费者问题

  • 2015-06-01 22:06
  • 16KB
  • 下载

Java线程之由生产者/消费者问题看线程同步与通信

生产者消费者问题是研究多线程程序时绕不开的问题,它的描述是有一块生产者和消费者共享的有界缓冲区,生产者往缓冲区放入产品,消费者从缓冲区取走产品,这个过程可以无休止的执行,不能因缓冲区满生产者放不进产品...
  • zmx729618
  • zmx729618
  • 2016-06-08 10:35
  • 313

【操作系统】生产者消费者问题分析(线程同步)

生产者消费者问题分析
  • u010095182
  • u010095182
  • 2014-04-29 01:53
  • 849

C#生产者与消费者问题 线程同步

//一个同步程序,生产者向一个缓冲区(定义为三个字节)中写入数据,消费者从中提取数   //据,如果缓冲区中没有数据,那么consumer只好wait,进入等待状态,当另一个线程(也就是   //...
  • u010224506
  • u010224506
  • 2013-05-03 10:54
  • 268

第九章 Java多线程机制 05_线程同步_7_生产者消费者问题

鱼欲遇雨:每日都学习一点,持之以恒,天道酬勤!不能用电脑时,提前补上!(2012.9.3) 模拟消费者和生产者之间的关系 示例代码:(线程的核心) // ProducerConsumer...
  • jinhongliang123
  • jinhongliang123
  • 2012-09-03 23:25
  • 604
    个人资料
    • 访问:19569次
    • 积分:623
    • 等级:
    • 排名:千里之外
    • 原创:39篇
    • 转载:20篇
    • 译文:0篇
    • 评论:0条
    文章分类