您的位置:首页 > 其它

基于单链表的生产者消费者问题

2017-04-06 09:21 148 查看
『生产者与消费者问题分析』

    「原理」生产者生产产品,消费者消费产品。产品如果被消费者消费完了,同时生产者又没有生产出产品,消费者             就必须等待。同样的,如果生产者生产了产品,而消费者没有去消费,生产者就要在消费者消费了产品之后再
                生产。生产者和消费者之间既有同步的关系,又存在互斥的部分。

『互斥量(Mutex)』

     「原理」互斥量是一个可以处于两态之一的变量:解锁和加锁。互斥量仅仅适用于管理共享资源或一小段代码。获              得锁的线程可以完成“读—修改—写”的操作,然后释放锁给其他线程。没获得锁的线程只能等待而不能访
                   问共享数据。“读—修改—写”组成一个原子操作,不会在中间被打断。

     「使用方法」

                   pthread_mutex_t Mutex;声明Mutex;

                   int pthread_mutex_init(pthread_mutex_t*
restrict mutex, const pthread_mutexattr_t *restrict                          attr);初始化Mutex。成功返回0,失败返回错误号;

                  int pthread_mutex_destroy(pthread_mutex_t* mutex);用来销毁由pthread_mutex_init初始化的                         Mutex;

                  如果Mutex变量是静态分配的,也可以用宏定义PTHREAD_MUTEX_INITIALIZER初始化,相当于用                          pthread_mutex_init初始化并且attr参数为NULL;

                  int pthread_mutex_lock(pthread_mutex_t* mutex);获得Mutex完成加锁操作。如果这时另一个线程已                 经获得了这个Mutex,则该线程挂起等待。直到另一个线程释放这个Mutex;

                  int pthread_mutex_trylock(pthread_mutex_t* mutex);如果Mutex已被某个线程获得,该函数失败返回                 EBUSY而不会使线程挂起等待;

                  int pthread_mutex_unlock(pthread_mutex_t* mutex);释放Mutex解锁;

     「lock和unlock」

                  假设Mutex的值为1表示互斥锁空闲,此时某个线程调用lock可以获得锁,Mutex的值变为0表示互斥锁已
                被某个线程获得,如果其它线程调用lock则挂起等待。

      

『条件变量(Condition Variable)』

      「原理」条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包含两个动作:一个线程等待“条件
                 变量条件成立”而挂起,另一个线程使“条件成立”(给出条件成立信号)。为了防止竞争,条件变量的使                   用总是和一个互斥锁结合在一起。

     「使用方法」

                    int pthread_cond_init(pthread_cond_t*
restrict cond, const pthread_condattr_t *restrict attr);初                     始化一个条件变量。成功返回0,失败返回错误号;

             
      int pthread_cond_destroy(pthread_cond_t* cond);函数销毁一个条件变量;

 
                  如果cond变量是静态分配的,也可以用宏定义PTHREAD_COND_INITIALIZER初始化,相当于用                             pthread_cond_init初始化并且attr参数为NULL;

 
                  int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);一个线程                   可以调用这个函数在一个条件变量上阻塞等待。这个函数有三个操作:释放Mutex,阻塞等待,当被唤醒                       时重新获得Mutex并返回;

 
                  int pthread_cond_timedwait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict                                     mutex, conststruct timespec *restrict abstime);函数还有一个额外的参数设定等待超时,如果达到了                           abtime所指定的时刻仍没有被别的线程唤醒当前线程,就返回ETIMEDOUT;

 
                  int pthread_cond_signal(pthread_cond_t *cond);函数唤醒条件变量上另一个等待的线程;

 
                  int pthread_cond_broadcast(pthread_cond_t *cond);唤醒条件变量上的所有线程;

『生产者与消费者问题实现』

      「说明」生产者生产一个产品放在单链表的表头上,消费者从表头上消费产品。

              


              


             


              


              


             


    「运行结果」

              
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: