今天看书,看了一个例子,于是自己手动的自己敲了一下。。。
但是,期望的结果和理论结果是不一样的,求解答啊。。。
上源代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
我已经设置了并发的函数,为什么还是会出现这种结果。?求高手帮助!!!