| 
		    
                    
   同步就是线程等待某个事件的发生。只有当等待的事件发生线程才继续执行,否则线程挂起并放弃处理器。当多个线程协作时,相互作用的任务必须在一定的条件下同步。Linux下的C语言编程有多种线程同步机制,最典型的是条件变量(condition variable)。而在头文件semaphore.h 中定义的信号量则完成了互斥体和条件变量的封装,按照多线程程序设计中访问控制机制,控制对资源的同步访问,提供程序设计人员更方便的调用接口。下面的生产者/消费者问题说明了Linux线程的控制和通信: 
 
    
        
            | 
             #include <stdio.h> #include <pthread.h> #define BUFFER_SIZE 16  struct prodcons {  int buffer[BUFFER_SIZE];  pthread_mutex_t lock;  int readpos, writepos;   pthread_cond_t notempty;  pthread_cond_t notfull; }; /* 初始化缓冲区结构 */ void init(struct prodcons *b) {  pthread_mutex_init(&b->lock, NULL);  pthread_cond_init(&b->notempty, NULL);  pthread_cond_init(&b->notfull, NULL);  b->readpos = 0;  b->writepos = 0; } /* 将产品放入缓冲区,这里是存入一个整数*/ void put(struct prodcons *b, int data) {  pthread_mutex_lock(&b->lock);  /* 等待缓冲区未满*/  if ((b->writepos + 1) % BUFFER_SIZE == b->readpos)  {   pthread_cond_wait(&b->notfull, &b->lock);  }  /* 写数据,并移动指针 */  b->buffer[b->writepos] = data;  b->writepos++;  if (b->writepos > = BUFFER_SIZE)   b->writepos = 0;  /* 设置缓冲区非空的条件变量*/  pthread_cond_signal(&b->notempty);  pthread_mutex_unlock(&b->lock); }
  /* 从缓冲区中取出整数*/ int get(struct prodcons *b) {  int data;  pthread_mutex_lock(&b->lock);  /* 等待缓冲区非空*/  if (b->writepos == b->readpos)  {   pthread_cond_wait(&b->notempty, &b->lock);  }  /* 读数据,移动读指针*/  data = b->buffer[b->readpos];  b->readpos++;  if (b->readpos > = BUFFER_SIZE)   b->readpos = 0;  /* 设置缓冲区未满的条件变量*/  pthread_cond_signal(&b->notfull);  pthread_mutex_unlock(&b->lock);  return data; } 
             | 
         
    
 
		    
                      
		      
		      
		   |