多线程实现消费者生产者的例子

来源:互联网 发布:聚友网络股份有限公司 编辑:程序博客网 时间:2024/05/22 02:17

今天看书,看了一个例子,于是自己手动的自己敲了一下。。。

但是,期望的结果和理论结果是不一样的,求解答啊。。。

上源代ma

[cpp] view plain copy
  1. #include "apue.h"  
  2.   
  3. #include        <sys/types.h>   /* basic system data types */  
  4. #include        <sys/time.h>    /* timeval{} for select() */  
  5. #include        <time.h>                /* timespec{} for pselect() */  
  6. #include        <errno.h>  
  7. #include        <fcntl.h>               /* for nonblocking */  
  8. #include        <limits.h>              /* PIPE_BUF */  
  9. #include        <signal.h>  
  10. #include        <stdio.h>  
  11. #include        <stdlib.h>  
  12. #include        <string.h>  
  13. #include        <sys/stat.h>    /* for S_xxx file mode constants */  
  14. #include        <unistd.h>  
  15. #include        <sys/wait.h>  
  16. #include        <pthread.h>  
  17.   
  18. #define MAXNITEMS 1000000  
  19. #define MAXNTHREADS  100  
  20.   
  21. int nitems;  
  22.   
  23. struct {  
  24.     pthread_mutex_t mutex;  
  25.     int buff[MAXNITEMS];  
  26.     int nput;//buff数组下一次存放的元素下标。  
  27.     int navl;//下一次存放的值。  
  28. } shared= {  
  29.     PTHREAD_MUTEX_INITIALIZER //初始化互斥变量  
  30. };  
  31.   
  32. void*  produce(void* );//生产者线程  
  33. void*  consume(void* );///消费者线程;  
  34. void consume_wait(int i);//  
  35.   
  36.   
  37. int main(int argc,char** argv)  
  38. {  
  39.     int i; //循环变量  
  40.     int nthreads; //线程数  
  41.     int count[MAXNTHREADS]; ////线程计数  
  42.     pthread_t tid_produce[MAXNTHREADS] ,tid_consumer;/// 存放线程id  
  43.       
  44.     if(argc<3)  
  45.         err_quit("usage:cansu error");  
  46.     nitems=min(atoi(argv[1]),MAXNITEMS);  
  47.     nthreads=min(atoi(argv[2]),MAXNTHREADS);  
  48.     //set_concurrency();  
  49.     pthread_setconcurrency(nthreads);  
  50.     for(i=0;i<nthreads;i++)  
  51.     {  
  52.         count[i]=0;  
  53.         pthread_create(&tid_produce[i],NULL,produce,&count[i]);   
  54.     }  
  55.     pthread_create(&tid_consumer,NULL,consume,NULL);  
  56.     for(i=0;i<nthreads;i++)  
  57.     {     
  58.         pthread_join(tid_produce[i],NULL);  
  59.         printf("count[%d]=%d\n",i,count[i]);  
  60.     }  
  61.     pthread_join(tid_consumer,NULL);  
  62.   
  63.     return 0;  
  64. }  
  65. /** 
  66.     生产者线程, shared 结构对 buff进行写数据 
  67. **/  
  68. void* produce(void* arg)  
  69. {    
  70.     for(;;)  
  71.     {  
  72.         pthread_mutex_lock(&shared.mutex);///  对shared.mutex加锁  
  73.         if(shared.nput>=nitems)  
  74.         {  
  75.             pthread_mutex_unlock(&shared.mutex);  
  76.             return ;  
  77.         }  
  78.           
  79.         shared.buff[shared.nput]=shared.navl; //对buff赋值  
  80.         shared.nput++;  
  81.         shared.navl++;  
  82.         pthread_mutex_unlock(&shared.mutex);///  对shared.mutex解锁  
  83.           
  84.         *((int*)arg)+=1;  
  85.     }  
  86.           
  87. }  
  88.   
  89. void*  consume(void* arg)  
  90. {  
  91.     int i;  
  92.     for(i=0;i<nitems;i++)  
  93.     {  
  94.         consume_wait(i);  
  95.         if(shared.buff[i]!=i)  
  96.             printf("buff[%d]=%d\n",i,shared.buff[i]);  
  97.     }  
  98.     return ;  
  99. }  
  100.   
  101. void consume_wait(int i)  
  102. {  
  103.     pthread_mutex_lock(&shared.mutex);///  对shared.mutex加锁  
  104.     if(i<shared.nput)  
  105.     {     
  106.         pthread_mutex_unlock(&shared.mutex);  
  107.         return ;  
  108.     }  
  109.     pthread_mutex_unlock(&shared.mutex);///  对shared.mutex解锁  
  110.           
  111. }  


输出结果

[devis@gdmss wangchenglin]$ ./produce_consumer  100000 10
count[0]=100000
count[1]=0
count[2]=0
count[3]=0
count[4]=0
count[5]=0
count[6]=0
count[7]=0
count[8]=0
count[9]=0

我已经设置了并发的函数,为什么还是会出现这种结果。?求高手帮助!!!

0 0
原创粉丝点击