#include <stdio.h>
#include <pthread.h>
#define MAXNITEMS 1000000
int nitems;
int buff [MAXNITEMS];
struct
{
pthread_mutex_t mutex;
int nput;
int nval;
}put = {PTHREAD_MUTEX_INITIALIZER};
struct
{
pthread_mutex_t mutex;
pthread_cond_t cond;
int nready;
} nready = {PTHREAD_MUTEX_INITIALIZER,PTHREAD_COND_INITIALIZER};
void *produce(void *arg);
void *consume(void *arg);
int main(int argc, char *argv[])
{
int i = 0,nthreads = 0,count[5];
pthread_t tid_produce[5],tid_consume;
nthreads = 5;
nitems = MAXNITEMS;
for(i = 0; i < nthreads; i++)
{
count[i] = 0;
pthread_create(&tid_produce[i], NULL, produce, &count[i]);
}
pthread_create(&tid_consume, 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_consume, NULL);
return 0;
}
void *produce(void *arg)
{
for( ; ; )
{
pthread_mutex_lock(&put.mutex);
if(put.nput >= nitems)
{
pthread_mutex_unlock(&put.mutex);
return NULL;
}
buff[put.nput] = put.nval;
put.nput++;
put.nval++;
pthread_mutex_unlock(&put.mutex);
pthread_mutex_lock(&nready.mutex);
if(nready.nready == 0)
{
pthread_cond_signal( &nready.cond);
}
nready.nready++;
pthread_mutex_unlock(&nready.mutex);
*((int *)arg) += 1;
}
return NULL;
}
void *consume(void *arg)
{
int i = 0;
for(i =0; i < nitems; i++)
{
pthread_mutex_lock(&nready.mutex);
while(nready.nready == 0)
{
/*1,阻塞等待条件变量
2,解锁unlock
3,当某个线程调用pthread_cond_signal时 重新上锁lock
*/
pthread_cond_wait(&nready.cond, &nready.mutex);
}
nready.nready--;
pthread_mutex_unlock(&nready.mutex);
if(buff[i] != i)
{
printf("buff[%d] = %d\n", i, buff[i]);
}
}
return NULL;
}