zoukankan      html  css  js  c++  java
  • 生产者消费者问题(基于线程和无名信号量)

    //5.生产者消费者问题
    #include <pthread.h>  
    #include <semaphore.h>  
    #include <unistd.h>  
    #include <stdio.h>  
    #define MAX 50  
    #define BUFSIZE 10  //仓库的大小
    int buf[BUFSIZE]={0};  
    int in=0;  
    int out=0;  
    sem_t full,empty;   
    void* producer(void* arg)  
    {  
       int i;  
       for (i = 1;i<=MAX;++i)  
        {  
           /*produce*/  
           sem_wait(&full);  
           buf[in++]=i;  
           in%=BUFSIZE;  
           printf("生产了第%d个产品
    " ,i);
           sem_post(&empty);  
        }  
       pthread_exit((void*)"thread1 exit
    ");  
    }  
    void* comsumer(void* arg)  
    {  
       int i,data_c;  
       for (i = 1;i<= MAX; ++i)  
        {  
           /*comsumer*/  
           sem_wait(&empty);  
           data_c=buf[out++]; 
           out%=BUFSIZE;
           printf("消费了%d个产品
    " ,data_c);
           sem_post(&full);  
        }  
       pthread_exit((void*)"thread2 exit
    ");  
    }  
    int main(void)  
    {  
       void *tret;  
       sem_init(&full,0,10);  //信号量的初始值为10和仓库的大小保持一致
       sem_init(&empty,0,0);  
       pthread_t tid_producer,tid_comsumer;  
       pthread_create(&tid_producer,NULL,producer,NULL);  
       pthread_create(&tid_comsumer,NULL,comsumer,NULL);  
       pthread_join(tid_producer,&tret);  
       printf("%s
    ",(char*)tret);  
       pthread_join(tid_comsumer,&tret);  
       printf("%s
    ",(char*)tret);  
       sem_destroy(&full);  
       sem_destroy(&empty);  
       return 0;
    }
    此程序一定要注意信号量的个数一定要和仓库的存储空间大小数值上要一样大,此程序两个数都为10
  • 相关阅读:
    HTCVive摄像头的一些好玩的现象
    AI之A*算法
    C#预处理器指令之#define/#undefine/#if/#elif/#else/#endif
    AI之有限状态机
    Unity之动态加载场景资源
    Canvas
    DFGUI之界面文字显示异常
    Unity Application
    AI:确定性AI
    php正则表达式
  • 原文地址:https://www.cnblogs.com/leijiangtao/p/4097948.html
Copyright © 2011-2022 走看看