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
  • 相关阅读:
    C# 中==和Equal的区别
    3dmath复习随笔
    3dmax学习资料记录
    [官方教程] Unity 5 BLACKSMITH深度分享
    [技术] [插件精选] 炫酷粒子特效(下)
    Unity3D总结:关于射线碰撞
    Unity3D将来时:IL2CPP(上)
    3DMAX 9 角色建模3 uv展开
    php,c# hamsha1
    U3D 的一些基础优化
  • 原文地址:https://www.cnblogs.com/leijiangtao/p/4097948.html
Copyright © 2011-2022 走看看