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