最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

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

来源:动视网 责编:小OO 时间:2025-09-27 20:58:44
文档

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

生产者-消费者问题是一个经典的进程同步问题,已经属于化石级别的了。该问题最早由Dijkstra提出,用以演示他提出的信号量机制。要求设计在同一个进程地址空间内执行的两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。  要求设计并实现一
推荐度:
导读生产者-消费者问题是一个经典的进程同步问题,已经属于化石级别的了。该问题最早由Dijkstra提出,用以演示他提出的信号量机制。要求设计在同一个进程地址空间内执行的两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。  要求设计并实现一
生产者-消费者问题是一个经典的进程同步问题,已经属于化石级别的了。该问题最早由Dijkstra提出,用以演示他提出的信号量机制。要求设计在同一个进程地址空间内执行的两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。

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

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

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

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

看代码吧:

//pv操作:生产者与消费者经典问题

//author:leaf

#include 

#include 

#include 

#include 

#include 

#define M 32             /*缓冲数目*/

#define P(x)     sem_wait(&x)

#define V(x)    sem_post(&x)

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

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

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

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

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

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

/*

 *output the buffer

 */

void print()

{

    int i;

    for(i = 0; i < M; i++)

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

    printf("\\n");

}

/* 

 *producer 

 */

void *producer()

{

    for(;;)

    {

        sleep(1);

        P(empty_sem);

        pthread_mutex_lock(&mutex);

        in = in % M;

        printf("(+)produce a product. 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("(-)consume a product. buffer:");

        buff[out] = 0;

        print();

        ++out;

        pthread_mutex_unlock(&mutex);

        V(empty_sem);

    }

}

void sem_mutex_init()

{

    /*

     *semaphore initialize

     */

    int init1 = sem_init(&empty_sem, 0, M);

    int init2 = sem_init(&full_sem, 0, 0); 

    if( (init1 != 0) && (init2 != 0)) 

    {

        printf("sem init failed \\n");

        exit(1);

    }

    /*

     *mutex initialize

     */

    int init3 = pthread_mutex_init(&mutex, NULL);

    if(init3 != 0)

    {

        printf("mutex init failed \\n");

        exit(1);

    }

    

}

int main()

{

    pthread_t id1;

    pthread_t id2;

    int i;

    int ret;

    sem_mutex_init();

    /*create the producer thread*/

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

    if(ret != 0)

    {

        printf("producer creation failed \\n");

        exit(1);

    }

    

    /*create the consumer thread*/

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

    if(ret != 0)

    {

        printf("consumer creation failed \\n");

        exit(1);

    }

    pthread_join(id1,NULL);

    pthread_join(id2,NULL);

    exit(0);

}
程序执行结果:

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

文档

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

生产者-消费者问题是一个经典的进程同步问题,已经属于化石级别的了。该问题最早由Dijkstra提出,用以演示他提出的信号量机制。要求设计在同一个进程地址空间内执行的两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。  要求设计并实现一
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top