《UNIX网络编程 卷2》读书笔记(三)

时间:2022-08-04 21:06:26

多个生产者,单个消费者,只考虑生产者之间的同步互斥

《UNIX网络编程 卷2》读书笔记(三)#include     " unpipc.h "
《UNIX网络编程 卷2》读书笔记(三)
《UNIX网络编程 卷2》读书笔记(三)
#define     MAXNITEMS         1000000
《UNIX网络编程 卷2》读书笔记(三)
#define     MAXNTHREADS            100
《UNIX网络编程 卷2》读书笔记(三)
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)
int         nitems;             /* read-only by producer and consumer */
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)
struct   {
《UNIX网络编程 卷2》读书笔记(三)  pthread_mutex_t    mutex;  
//互斥信号量
《UNIX网络编程 卷2》读书笔记(三)
  int    buff[MAXNITEMS];
《UNIX网络编程 卷2》读书笔记(三)  
int    nput;//下一个存放元素的下标
《UNIX网络编程 卷2》读书笔记(三)
  int    nval;//下一个存放的值
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)
}
 shared  =   { PTHREAD_MUTEX_INITIALIZER } ;
《UNIX网络编程 卷2》读书笔记(三)
《UNIX网络编程 卷2》读书笔记(三)
void      * produce( void   * ),  * consume( void   * );
《UNIX网络编程 卷2》读书笔记(三)
《UNIX网络编程 卷2》读书笔记(三)
int
《UNIX网络编程 卷2》读书笔记(三)main(
int  argc,  char   ** argv)
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)
{
《UNIX网络编程 卷2》读书笔记(三)    
int            i, nthreads, count[MAXNTHREADS];
《UNIX网络编程 卷2》读书笔记(三)    pthread_t    tid_produce[MAXNTHREADS], tid_consume;
《UNIX网络编程 卷2》读书笔记(三)
《UNIX网络编程 卷2》读书笔记(三)    
if (argc != 3)
《UNIX网络编程 卷2》读书笔记(三)        err_quit(
"usage: prodcons2 <#items> <#threads>");
《UNIX网络编程 卷2》读书笔记(三)    nitems 
= min(atoi(argv[1]), MAXNITEMS);//生产者存放的条目数
《UNIX网络编程 卷2》读书笔记(三)
    nthreads = min(atoi(argv[2]), MAXNTHREADS);//待创建的生产者线程数
《UNIX网络编程 卷2》读书笔记(三)

《UNIX网络编程 卷2》读书笔记(三)    Set_concurrency(nthreads);
//通知线程系统我们希望并发多少线程
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)
        /* 4start all the producer threads */
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)    
for (i = 0; i < nthreads; i++{
《UNIX网络编程 卷2》读书笔记(三)        count[i] 
= 0;//计数器初始化为0
《UNIX网络编程 卷2》读书笔记(三)
        Pthread_create(&tid_produce[i], NULL, produce, &count[i]);//创建生产者线程
《UNIX网络编程 卷2》读书笔记(三)
    }

《UNIX网络编程 卷2》读书笔记(三)
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)        
/* 4wait for all the producer threads */
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)    
for (i = 0; i < nthreads; i++{
《UNIX网络编程 卷2》读书笔记(三)        Pthread_join(tid_produce[i], NULL);
//等待生产者线程结束
《UNIX网络编程 卷2》读书笔记(三)
        printf("count[%d] = %d\n", i, count[i]);    
《UNIX网络编程 卷2》读书笔记(三)    }

《UNIX网络编程 卷2》读书笔记(三)    
//这样做的目的是为了避免生产者和消费者之间的同步问题,这里只考虑生产者之间的同步
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)
        /* 4start, then wait for the consumer thread */
《UNIX网络编程 卷2》读书笔记(三)    Pthread_create(
&tid_consume, NULL, consume, NULL);//创建消费者线程
《UNIX网络编程 卷2》读书笔记(三)
    Pthread_join(tid_consume, NULL);
《UNIX网络编程 卷2》读书笔记(三)
《UNIX网络编程 卷2》读书笔记(三)    exit(
0);
《UNIX网络编程 卷2》读书笔记(三)}

《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)
/* end main */
《UNIX网络编程 卷2》读书笔记(三)
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)
/* include producer */
《UNIX网络编程 卷2》读书笔记(三)
void   *
《UNIX网络编程 卷2》读书笔记(三)produce(
void   * arg)
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)
{
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)    
for ( ; ; ) {
《UNIX网络编程 卷2》读书笔记(三)        Pthread_mutex_lock(
&shared.mutex);
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)        
if (shared.nput >= nitems) {//生产完毕
《UNIX网络编程 卷2》读书笔记(三)
            Pthread_mutex_unlock(&shared.mutex);
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)            
return(NULL);        /* array is full, we're done */
《UNIX网络编程 卷2》读书笔记(三)        }

《UNIX网络编程 卷2》读书笔记(三)        shared.buff[shared.nput] 
= shared.nval;
《UNIX网络编程 卷2》读书笔记(三)        shared.nput
++;
《UNIX网络编程 卷2》读书笔记(三)        shared.nval
++;
《UNIX网络编程 卷2》读书笔记(三)        Pthread_mutex_unlock(
&shared.mutex);
《UNIX网络编程 卷2》读书笔记(三)        
*((int *) arg) += 1;//每个线程私有的计数器,不需要加锁
《UNIX网络编程 卷2》读书笔记(三)
    }

《UNIX网络编程 卷2》读书笔记(三)}

《UNIX网络编程 卷2》读书笔记(三)
《UNIX网络编程 卷2》读书笔记(三)
void   *
《UNIX网络编程 卷2》读书笔记(三)consume(
void   * arg)
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)
{
《UNIX网络编程 卷2》读书笔记(三)    
int        i;
《UNIX网络编程 卷2》读书笔记(三)
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)    
for (i = 0; i < nitems; i++{
《UNIX网络编程 卷2》读书笔记(三)        
if (shared.buff[i] != i)
《UNIX网络编程 卷2》读书笔记(三)            printf(
"buff[%d] = %d\n", i, shared.buff[i]);
《UNIX网络编程 卷2》读书笔记(三)    }

《UNIX网络编程 卷2》读书笔记(三)    
return(NULL);
《UNIX网络编程 卷2》读书笔记(三)}

《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)
/* end producer */
《UNIX网络编程 卷2》读书笔记(三)


生产者和消费者之间的同步,消费者采用的方式就是不断轮询。

《UNIX网络编程 卷2》读书笔记(三)
《UNIX网络编程 卷2》读书笔记(三)#include    
" unpipc.h "
《UNIX网络编程 卷2》读书笔记(三)
《UNIX网络编程 卷2》读书笔记(三)
#define     MAXNITEMS         1000000
《UNIX网络编程 卷2》读书笔记(三)
#define     MAXNTHREADS            100
《UNIX网络编程 卷2》读书笔记(三)
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)
int         nitems;             /* read-only by producer and consumer */
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)
struct   {
《UNIX网络编程 卷2》读书笔记(三)  pthread_mutex_t    mutex;
《UNIX网络编程 卷2》读书笔记(三)  
int    buff[MAXNITEMS];
《UNIX网络编程 卷2》读书笔记(三)  
int    nput;
《UNIX网络编程 卷2》读书笔记(三)  
int    nval;
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)}
 shared  =   { PTHREAD_MUTEX_INITIALIZER } ;
《UNIX网络编程 卷2》读书笔记(三)
《UNIX网络编程 卷2》读书笔记(三)
void      * produce( void   * ),  * consume( void   * );
《UNIX网络编程 卷2》读书笔记(三)
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)
/* include main */
《UNIX网络编程 卷2》读书笔记(三)
int
《UNIX网络编程 卷2》读书笔记(三)main(
int  argc,  char   ** argv)
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)
{
《UNIX网络编程 卷2》读书笔记(三)    
int            i, nthreads, count[MAXNTHREADS];
《UNIX网络编程 卷2》读书笔记(三)    pthread_t    tid_produce[MAXNTHREADS], tid_consume;
《UNIX网络编程 卷2》读书笔记(三)
《UNIX网络编程 卷2》读书笔记(三)    
if (argc != 3)
《UNIX网络编程 卷2》读书笔记(三)        err_quit(
"usage: prodcons3 <#items> <#threads>");
《UNIX网络编程 卷2》读书笔记(三)    nitems 
= min(atoi(argv[1]), MAXNITEMS);
《UNIX网络编程 卷2》读书笔记(三)    nthreads 
= min(atoi(argv[2]), MAXNTHREADS);
《UNIX网络编程 卷2》读书笔记(三)
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)        
/* 4create all producers and one consumer */
《UNIX网络编程 卷2》读书笔记(三)    Set_concurrency(nthreads 
+ 1);
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)    
for (i = 0; i < nthreads; i++{
《UNIX网络编程 卷2》读书笔记(三)        count[i] 
= 0;
《UNIX网络编程 卷2》读书笔记(三)        Pthread_create(
&tid_produce[i], NULL, produce, &count[i]);
《UNIX网络编程 卷2》读书笔记(三)    }

《UNIX网络编程 卷2》读书笔记(三)    Pthread_create(
&tid_consume, NULL, consume, NULL);
《UNIX网络编程 卷2》读书笔记(三)
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)        
/* 4wait for all producers and the consumer */
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)    
for (i = 0; i < nthreads; i++{
《UNIX网络编程 卷2》读书笔记(三)        Pthread_join(tid_produce[i], NULL);
《UNIX网络编程 卷2》读书笔记(三)        printf(
"count[%d] = %d\n", i, count[i]);    
《UNIX网络编程 卷2》读书笔记(三)    }

《UNIX网络编程 卷2》读书笔记(三)    Pthread_join(tid_consume, NULL);
《UNIX网络编程 卷2》读书笔记(三)
《UNIX网络编程 卷2》读书笔记(三)    exit(
0);
《UNIX网络编程 卷2》读书笔记(三)}

《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)
/* end main */
《UNIX网络编程 卷2》读书笔记(三)
《UNIX网络编程 卷2》读书笔记(三)
void   *
《UNIX网络编程 卷2》读书笔记(三)produce(
void   * arg)
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)
{
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)    
for ( ; ; ) {
《UNIX网络编程 卷2》读书笔记(三)        Pthread_mutex_lock(
&shared.mutex);
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)        
if (shared.nput >= nitems) {
《UNIX网络编程 卷2》读书笔记(三)            Pthread_mutex_unlock(
&shared.mutex);
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)            
return(NULL);        /* array is full, we're done */
《UNIX网络编程 卷2》读书笔记(三)        }

《UNIX网络编程 卷2》读书笔记(三)        shared.buff[shared.nput] 
= shared.nval;
《UNIX网络编程 卷2》读书笔记(三)        shared.nput
++;
《UNIX网络编程 卷2》读书笔记(三)        shared.nval
++;
《UNIX网络编程 卷2》读书笔记(三)        Pthread_mutex_unlock(
&shared.mutex);
《UNIX网络编程 卷2》读书笔记(三)        
*((int *) arg) += 1;
《UNIX网络编程 卷2》读书笔记(三)    }

《UNIX网络编程 卷2》读书笔记(三)}

《UNIX网络编程 卷2》读书笔记(三)
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)
/* include consume */
《UNIX网络编程 卷2》读书笔记(三)
void
《UNIX网络编程 卷2》读书笔记(三)consume_wait(
int  i)
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)
{
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)    
for ( ; ; ) {
《UNIX网络编程 卷2》读书笔记(三)        Pthread_mutex_lock(
&shared.mutex);
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)        
if (i < shared.nput) {
《UNIX网络编程 卷2》读书笔记(三)            Pthread_mutex_unlock(
&shared.mutex);
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)            
return;            /* an item is ready */
《UNIX网络编程 卷2》读书笔记(三)        }

《UNIX网络编程 卷2》读书笔记(三)        Pthread_mutex_unlock(
&shared.mutex);
《UNIX网络编程 卷2》读书笔记(三)    }

《UNIX网络编程 卷2》读书笔记(三)}

《UNIX网络编程 卷2》读书笔记(三)
《UNIX网络编程 卷2》读书笔记(三)
void   *
《UNIX网络编程 卷2》读书笔记(三)consume(
void   * arg)
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)
{
《UNIX网络编程 卷2》读书笔记(三)    
int        i;
《UNIX网络编程 卷2》读书笔记(三)
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)    
for (i = 0; i < nitems; i++{
《UNIX网络编程 卷2》读书笔记(三)        consume_wait(i);
《UNIX网络编程 卷2》读书笔记(三)        
if (shared.buff[i] != i)
《UNIX网络编程 卷2》读书笔记(三)            printf(
"buff[%d] = %d\n", i, shared.buff[i]);
《UNIX网络编程 卷2》读书笔记(三)    }

《UNIX网络编程 卷2》读书笔记(三)    
return(NULL);
《UNIX网络编程 卷2》读书笔记(三)}

《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)
/* end consume */
《UNIX网络编程 卷2》读书笔记(三)

每个条件变量都有一个互斥锁与之关联,调用pthread_cond_wait等待某个条件为真时,同时指定其条件变量的地址和所关联的互斥锁的地址

   使用条件变量来通知,避免消费者轮询

《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三) /* include globals */
《UNIX网络编程 卷2》读书笔记(三)#include    
" unpipc.h "
《UNIX网络编程 卷2》读书笔记(三)
《UNIX网络编程 卷2》读书笔记(三)
#define     MAXNITEMS         1000000
《UNIX网络编程 卷2》读书笔记(三)
#define     MAXNTHREADS            100
《UNIX网络编程 卷2》读书笔记(三)
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)        
/* globals shared by threads */
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)
int         nitems;                 /* read-only by producer and consumer */
《UNIX网络编程 卷2》读书笔记(三)
int         buff[MAXNITEMS];
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)
struct   {//用于生产者之间的同步
《UNIX网络编程 卷2》读书笔记(三)
  pthread_mutex_t    mutex;
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)  
int                nput;    /* next index to store */
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)  
int                nval;    /* next value to store */
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)}
 put  =   { PTHREAD_MUTEX_INITIALIZER } ;
《UNIX网络编程 卷2》读书笔记(三)
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)
struct   {//用于生产者和消费者之间同步
《UNIX网络编程 卷2》读书笔记(三)
  pthread_mutex_t    mutex;
《UNIX网络编程 卷2》读书笔记(三)  pthread_cond_t    cond;
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)  
int                nready;    /* number ready for consumer */
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)}
 nready  =   { PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER } ;
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)
/* end globals */
《UNIX网络编程 卷2》读书笔记(三)
《UNIX网络编程 卷2》读书笔记(三)
void      * produce( void   * ),  * consume( void   * );
《UNIX网络编程 卷2》读书笔记(三)
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)
/* include main */
《UNIX网络编程 卷2》读书笔记(三)
int
《UNIX网络编程 卷2》读书笔记(三)main(
int  argc,  char   ** argv)
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)
{
《UNIX网络编程 卷2》读书笔记(三)    
int            i, nthreads, count[MAXNTHREADS];
《UNIX网络编程 卷2》读书笔记(三)    pthread_t    tid_produce[MAXNTHREADS], tid_consume;
《UNIX网络编程 卷2》读书笔记(三)
《UNIX网络编程 卷2》读书笔记(三)    
if (argc != 3)
《UNIX网络编程 卷2》读书笔记(三)        err_quit(
"usage: prodcons6 <#items> <#threads>");
《UNIX网络编程 卷2》读书笔记(三)    nitems 
= min(atoi(argv[1]), MAXNITEMS);
《UNIX网络编程 卷2》读书笔记(三)    nthreads 
= min(atoi(argv[2]), MAXNTHREADS);
《UNIX网络编程 卷2》读书笔记(三)
《UNIX网络编程 卷2》读书笔记(三)    Set_concurrency(nthreads 
+ 1);
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)        
/* 4create all producers and one consumer */
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)    
for (i = 0; i < nthreads; i++{
《UNIX网络编程 卷2》读书笔记(三)        count[i] 
= 0;
《UNIX网络编程 卷2》读书笔记(三)        Pthread_create(
&tid_produce[i], NULL, produce, &count[i]);
《UNIX网络编程 卷2》读书笔记(三)    }

《UNIX网络编程 卷2》读书笔记(三)    Pthread_create(
&tid_consume, NULL, consume, NULL);
《UNIX网络编程 卷2》读书笔记(三)
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)        
/* wait for all producers and the consumer */
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)    
for (i = 0; i < nthreads; i++{
《UNIX网络编程 卷2》读书笔记(三)        Pthread_join(tid_produce[i], NULL);
《UNIX网络编程 卷2》读书笔记(三)        printf(
"count[%d] = %d\n", i, count[i]);    
《UNIX网络编程 卷2》读书笔记(三)    }

《UNIX网络编程 卷2》读书笔记(三)    Pthread_join(tid_consume, NULL);
《UNIX网络编程 卷2》读书笔记(三)
《UNIX网络编程 卷2》读书笔记(三)    exit(
0);
《UNIX网络编程 卷2》读书笔记(三)}

《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)
/* end main */
《UNIX网络编程 卷2》读书笔记(三)
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)
/* include prodcons */
《UNIX网络编程 卷2》读书笔记(三)
void   *
《UNIX网络编程 卷2》读书笔记(三)produce(
void   * arg)
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)
{
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)    
for ( ; ; ) {
《UNIX网络编程 卷2》读书笔记(三)        Pthread_mutex_lock(
&put.mutex);
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)        
if (put.nput >= nitems) {
《UNIX网络编程 卷2》读书笔记(三)            Pthread_mutex_unlock(
&put.mutex);
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)            
return(NULL);        /* array is full, we're done */
《UNIX网络编程 卷2》读书笔记(三)        }

《UNIX网络编程 卷2》读书笔记(三)        buff[put.nput] 
= put.nval;
《UNIX网络编程 卷2》读书笔记(三)        put.nput
++;
《UNIX网络编程 卷2》读书笔记(三)        put.nval
++;
《UNIX网络编程 卷2》读书笔记(三)        Pthread_mutex_unlock(
&put.mutex);
《UNIX网络编程 卷2》读书笔记(三)
《UNIX网络编程 卷2》读书笔记(三)        Pthread_mutex_lock(
&nready.mutex);
《UNIX网络编程 卷2》读书笔记(三)        
if (nready.nready == 0)
《UNIX网络编程 卷2》读书笔记(三)            Pthread_cond_signal(
&nready.cond);//发出信号唤醒消费者
《UNIX网络编程 卷2》读书笔记(三)
        nready.nready++;//置为1 
《UNIX网络编程 卷2》读书笔记(三)
        Pthread_mutex_unlock(&nready.mutex);
《UNIX网络编程 卷2》读书笔记(三)
《UNIX网络编程 卷2》读书笔记(三)        
*((int *) arg) += 1;
《UNIX网络编程 卷2》读书笔记(三)    }

《UNIX网络编程 卷2》读书笔记(三)}

《UNIX网络编程 卷2》读书笔记(三)
《UNIX网络编程 卷2》读书笔记(三)
void   *
《UNIX网络编程 卷2》读书笔记(三)consume(
void   * arg)
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)
{
《UNIX网络编程 卷2》读书笔记(三)    
int        i;
《UNIX网络编程 卷2》读书笔记(三)
《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)    
for (i = 0; i < nitems; i++{
《UNIX网络编程 卷2》读书笔记(三)        Pthread_mutex_lock(
&nready.mutex);
《UNIX网络编程 卷2》读书笔记(三)        
while (nready.nready == 0)
《UNIX网络编程 卷2》读书笔记(三)            Pthread_cond_wait(
&nready.cond, &nready.mutex);//wait条件变量
《UNIX网络编程 卷2》读书笔记(三)
        nready.nready--;//置为0
《UNIX网络编程 卷2》读书笔记(三)
        Pthread_mutex_unlock(&nready.mutex);
《UNIX网络编程 卷2》读书笔记(三)
《UNIX网络编程 卷2》读书笔记(三)        
if (buff[i] != i)
《UNIX网络编程 卷2》读书笔记(三)            printf(
"buff[%d] = %d\n", i, buff[i]);
《UNIX网络编程 卷2》读书笔记(三)    }

《UNIX网络编程 卷2》读书笔记(三)    
return(NULL);
《UNIX网络编程 卷2》读书笔记(三)}

《UNIX网络编程 卷2》读书笔记(三)《UNIX网络编程 卷2》读书笔记(三)
/* end prodcons */
《UNIX网络编程 卷2》读书笔记(三)