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

生产者与消费者问题分析

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


互斥量(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;

扫描二维码关注公众号,回复: 1488598 查看本文章

                  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);唤醒条件变量上的所有线程;


生产者与消费者问题实现

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

              

              

              

              

              

              

    运行结果

              

猜你喜欢

转载自blog.csdn.net/sinat_35297665/article/details/80044361