23,118
社区成员
发帖
与我相关
我的任务
分享
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#define MAXNITEMS 10000
#define MAXNTHREADS 100
/**************global shared by threads*********/
int nitems;//read-only by produces and consumer
int buf[MAXNITEMS];
//生产者变量和互斥锁收集到一个结构中
struct{
pthread_mutex_t mutex;
int nput; //next index to store
int nval; //next value to store
}put = {PTHREAD_MUTEX_INITIALIZER};
//
struct{
pthread_mutex_t mutex;
pthread_cond_t cond;
int nready;//number ready for consumer
}nready = {
PTHREAD_MUTEX_INITIALIZER,PTHREAD_COND_INITIALIZER
};
int mymin(int a,int b)
{
return a>b?b:a;
}
void *produce(void *arg)
{
for (;;)
{
pthread_mutex_lock(&put.mutex);
//这里要加判断是否大于最大items数
if (put.nput > nitems)
{
pthread_mutex_unlock(&put.mutex);
//printf("超过最大items[%d]\n",nitems);
return NULL;
}
put.nput++;
put.nval++;
buf[put.nput] = put.nval;
pthread_mutex_unlock(&put.mutex);
pthread_mutex_lock(&nready.mutex);
if (nready.nready == 0) //
{
printf("thread produce signal 11\n");
pthread_cond_signal(&nready.cond);//条件满足唤醒consumer
printf("thread produce signal 22\n\n");
}
//if (buf[put.nput] >= 0)
{
nready.nready++; //什么时候加1???
}
pthread_mutex_unlock(&nready.mutex);
sleep(1);
}
}
void *consumer(void *arg)
{
//for (;;)
int i;
for (i = 0; i < nitems; ++ i)
{
{
pthread_mutex_lock(&nready.mutex);
//if (nready.nready <= 0)
while(nready.nready == 0) //
{
printf("thread consumer wait 111!\n");
pthread_cond_wait(&nready.cond,&nready.mutex);//等待条件满足
printf("thread consumer wait 22!\n\n");
}
printf("nready.nready = %d\n",nready.nready);
nready.nready--;
pthread_mutex_unlock(&nready.mutex);
sleep(1);
}
}
return NULL;
}
int main(int argc,char *argv[])
{
pthread_t tid_produces[MAXNTHREADS],tid_consumer;
int i;
int nthreads;
int count[MAXNTHREADS];
if (argc !=3)
{
printf("usage:produces<#items><#threads>");
exit(-1);
}
nitems = mymin(atoi(argv[1]),MAXNITEMS);
nthreads = mymin(atoi(argv[2]),MAXNTHREADS);
for (i = 0 ; i < nthreads;++i)
{
pthread_create(&tid_produces[i],NULL,produce,NULL);
}
pthread_create(&tid_consumer,NULL,consumer,NULL);
//等待线程被执行
for (i = 0 ; i < nthreads;++i)
{
pthread_join(tid_produces[i],NULL);
}
pthread_join(tid_consumer,NULL);
return 0;
}