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
  • 相关阅读:
    VS2015安装水晶报表
    C# 通过java生成的RSA公钥加密和解密
    T4代码生成器
    产品开发- DFX
    读《31天学会CRM项目开发》记录3
    读《31天学会CRM项目开发》记录2
    读《31天学会CRM项目开发》记录1
    产品开发
    产品开发
    机器视觉
  • 原文地址:https://www.cnblogs.com/leijiangtao/p/4097948.html
Copyright © 2011-2022 走看看