操作系统生产者和消费者问题.doc

上传人:wj 文档编号:4849498 上传时间:2023-05-07 格式:DOC 页数:6 大小:695KB
下载 相关 举报
操作系统生产者和消费者问题.doc_第1页
第1页 / 共6页
操作系统生产者和消费者问题.doc_第2页
第2页 / 共6页
操作系统生产者和消费者问题.doc_第3页
第3页 / 共6页
操作系统生产者和消费者问题.doc_第4页
第4页 / 共6页
操作系统生产者和消费者问题.doc_第5页
第5页 / 共6页
操作系统生产者和消费者问题.doc_第6页
第6页 / 共6页
亲,该文档总共6页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

操作系统生产者和消费者问题.doc

《操作系统生产者和消费者问题.doc》由会员分享,可在线阅读,更多相关《操作系统生产者和消费者问题.doc(6页珍藏版)》请在冰点文库上搜索。

操作系统生产者和消费者问题.doc

生产者-消费者问题是一个经典的进程同步问题,已经属于化石级别的了。

该问题最早由Dijkstra提出,用以演示他提出的信号量机制。

要求设计在同一个进程地址空间内执行的两个线程。

生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。

消费者线程从缓冲区中获得物品,然后释放缓冲区。

当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。

当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。

  要求设计并实现一个进程,该进程拥有一个生产者线程和一个消费者线程,它们使用N个不同的缓冲区(N为一个自定义的确定的数值,例如N=32)。

需要使用如下信号量:

·一个互斥信号量,用以阻止生产者线程和消费者线程同时操作缓冲区列表;

·一个信号量,当生产者线程生产出一个物品时可以用它向消费者线程发出信号;

·一个信号量,消费者线程释放出一个空缓冲区时可以用它向生产者线程发出信号;

看代码吧:

//pv操作:

生产者与消费者经典问题

//author:

leaf

#include

#include

#include

#include

#include

#defineM32            /*缓冲数目*/

#defineP(x)    sem_wait(&x)

#defineV(x)    sem_post(&x)

intin=0;        /*生产者放置产品的位置*/

intout=0;            /*消费者取产品的位置*/

intbuff[M]={0};    /*缓冲初始化为0,开始时没有产品*/

sem_tempty_sem;        /*同步信号量,当满了时阻止生产者放产品*/

sem_tfull_sem;        /*同步信号量,当没产品时阻止消费者消费*/

pthread_mutex_tmutex;/*互斥信号量,一次只有一个线程访问缓冲*/

/*

 *outputthebuffer

 */

voidprint()

{

    inti;

    for(i=0;i

        printf("%d",buff[i]);

    printf("\n");

}

/*

 *producer

 */

void*producer()

{

    for(;;)

    {

        sleep

(1);

        P(empty_sem);

        pthread_mutex_lock(&mutex);

        in=in%M;

        printf("(+)produceaproduct.buffer:

");

        buff[in]=1;

        print();

        ++in;

        pthread_mutex_unlock(&mutex);

        V(full_sem);

    }

}

/*

 *consumer

 */

void*consumer()

{

    for(;;)

    {

        sleep

(2);

        P(full_sem);

        pthread_mutex_lock(&mutex);

        out=out%M;

        printf("(-)consumeaproduct.buffer:

");

        buff[out]=0;

        print();

        ++out;

        pthread_mutex_unlock(&mutex);

        V(empty_sem);

    }

}

voidsem_mutex_init()

{

    /*

    *semaphoreinitialize

    */

    intinit1=sem_init(&empty_sem,0,M);

    intinit2=sem_init(&full_sem,0,0);

    if((init1!

=0)&&(init2!

=0))

    {

        printf("seminitfailed\n");

        exit

(1);

    }

    /*

    *mutexinitialize

    */

    intinit3=pthread_mutex_init(&mutex,NULL);

    if(init3!

=0)

    {

        printf("mutexinitfailed\n");

        exit

(1);

    }

    

}

intmain()

{

    pthread_tid1;

    pthread_tid2;

    inti;

    intret;

    sem_mutex_init();

    /*createtheproducerthread*/

    ret=pthread_create(&id1,NULL,producer,NULL);

    if(ret!

=0)

    {

        printf("producercreationfailed\n");

        exit

(1);

    }

    

    /*createtheconsumerthread*/

    ret=pthread_create(&id2,NULL,consumer,NULL);

    if(ret!

=0)

    {

        printf("consumercreationfailed\n");

        exit

(1);

    }

    pthread_join(id1,NULL);

    pthread_join(id2,NULL);

    exit(0);

}

程序执行结果:

其中1表示已经生产出的产品,1的个数就代表已生产出的产品个数。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2