多线程实现消费者生产者的例子
来源:互联网 发布:聚友网络股份有限公司 编辑:程序博客网 时间:2024/05/22 02:17
今天看书,看了一个例子,于是自己手动的自己敲了一下。。。
但是,期望的结果和理论结果是不一样的,求解答啊。。。
上源代ma
- #include "apue.h"
- #include <sys/types.h> /* basic system data types */
- #include <sys/time.h> /* timeval{} for select() */
- #include <time.h> /* timespec{} for pselect() */
- #include <errno.h>
- #include <fcntl.h> /* for nonblocking */
- #include <limits.h> /* PIPE_BUF */
- #include <signal.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <sys/stat.h> /* for S_xxx file mode constants */
- #include <unistd.h>
- #include <sys/wait.h>
- #include <pthread.h>
- #define MAXNITEMS 1000000
- #define MAXNTHREADS 100
- int nitems;
- struct {
- pthread_mutex_t mutex;
- int buff[MAXNITEMS];
- int nput;//buff数组下一次存放的元素下标。
- int navl;//下一次存放的值。
- } shared= {
- PTHREAD_MUTEX_INITIALIZER //初始化互斥变量
- };
- void* produce(void* );//生产者线程
- void* consume(void* );///消费者线程;
- void consume_wait(int i);//
- int main(int argc,char** argv)
- {
- int i; //循环变量
- int nthreads; //线程数
- int count[MAXNTHREADS]; ////线程计数
- pthread_t tid_produce[MAXNTHREADS] ,tid_consumer;/// 存放线程id
- if(argc<3)
- err_quit("usage:cansu error");
- nitems=min(atoi(argv[1]),MAXNITEMS);
- nthreads=min(atoi(argv[2]),MAXNTHREADS);
- //set_concurrency();
- pthread_setconcurrency(nthreads);
- for(i=0;i<nthreads;i++)
- {
- count[i]=0;
- pthread_create(&tid_produce[i],NULL,produce,&count[i]);
- }
- pthread_create(&tid_consumer,NULL,consume,NULL);
- for(i=0;i<nthreads;i++)
- {
- pthread_join(tid_produce[i],NULL);
- printf("count[%d]=%d\n",i,count[i]);
- }
- pthread_join(tid_consumer,NULL);
- return 0;
- }
- /**
- 生产者线程, shared 结构对 buff进行写数据
- **/
- void* produce(void* arg)
- {
- for(;;)
- {
- pthread_mutex_lock(&shared.mutex);/// 对shared.mutex加锁
- if(shared.nput>=nitems)
- {
- pthread_mutex_unlock(&shared.mutex);
- return ;
- }
- shared.buff[shared.nput]=shared.navl; //对buff赋值
- shared.nput++;
- shared.navl++;
- pthread_mutex_unlock(&shared.mutex);/// 对shared.mutex解锁
- *((int*)arg)+=1;
- }
- }
- void* consume(void* arg)
- {
- int i;
- for(i=0;i<nitems;i++)
- {
- consume_wait(i);
- if(shared.buff[i]!=i)
- printf("buff[%d]=%d\n",i,shared.buff[i]);
- }
- return ;
- }
- void consume_wait(int i)
- {
- pthread_mutex_lock(&shared.mutex);/// 对shared.mutex加锁
- if(i<shared.nput)
- {
- pthread_mutex_unlock(&shared.mutex);
- return ;
- }
- pthread_mutex_unlock(&shared.mutex);/// 对shared.mutex解锁
- }
输出结果
[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
- 多线程实现消费者生产者的例子
- 多线程实现消费者生产者的例子
- Java多线程生产者和消费者的例子
- 生产者-消费者多线程实现
- 多线程实现生产者消费者
- 多线程实现生产者消费者
- 多线程实现生产者消费者
- 多线程--生产者消费者--简单例子
- 多线程生产者和消费者例子
- <JAVA>多线程-生产者消费者例子
- java 多线程的生产者-消费者 实现
- [多线程] 生产者消费者模型的BOOST实现
- 一个生产者与消费者模型的多线程例子程序
- c++多线程实现生产者消费者
- 生产者消费者Java多线程实现
- Java多线程实现,生产者消费者
- 生产者-消费者的经典例子
- 生产者,消费者的几个例子
- JBoss 目录结构解释
- poj 3207 Ikki's Story IV - Panda's Trick
- MySQL的基本使用相关知识
- Ajax实现的步骤
- Android JNI 学习笔记
- 多线程实现消费者生产者的例子
- 代码训练营——建立一个java文件列表文件
- 自己理解的URL和URI的区别
- 此文仅用来帮助初学安卓的小伙伴,感兴趣的可以看看
- [Android] RippleDrawable
- 解决 iOS NSDictionary 输出中文字符”乱码”(Unicode编码)问题
- Java Comparator排序
- SQL注入攻防入门详解
- 如何使用Android调用百度地图API——实时定位