基于单链表的生产者消费者问题
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);唤醒条件变量上的所有线程;
『生产者与消费者问题实现』
「说明」生产者生产一个产品放在单链表的表头上,消费者从表头上消费产品。
![](https://img-blog.csdn.net/20170401163811181?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd3h0X2hpbGx3aWxs/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20170401163826811?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd3h0X2hpbGx3aWxs/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20170401163842525?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd3h0X2hpbGx3aWxs/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20170406145503925?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd3h0X2hpbGx3aWxs/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20170401163911062?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd3h0X2hpbGx3aWxs/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20170401163925984?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd3h0X2hpbGx3aWxs/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
「运行结果」
「原理」生产者生产产品,消费者消费产品。产品如果被消费者消费完了,同时生产者又没有生产出产品,消费者 就必须等待。同样的,如果生产者生产了产品,而消费者没有去消费,生产者就要在消费者消费了产品之后再
生产。生产者和消费者之间既有同步的关系,又存在互斥的部分。
『互斥量(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);唤醒条件变量上的所有线程;
『生产者与消费者问题实现』
「说明」生产者生产一个产品放在单链表的表头上,消费者从表头上消费产品。
「运行结果」
相关文章推荐
- 消费者和生产者问题的实现-基于线程安全的容器来和非线程安全的容器类
- java多线程-生产者消费者经典问题 基于BlockingQueue
- 【Linux】基于环形buf的多消费者多生产者问题
- 基于单链表和基于环形队列的生产者消费者模型
- 基于单链表和环形队列的生产者-消费者模型
- 线程-生产者消费者问题
- 生产者,消费者问题
- 生产者/消费者问题在windows2000下的实现
- 生产者-消费者问题
- 用C#线程技术模拟“生产者-消费者”经典进程同步问题
- 用JAVA 实现“生产者-消费者”问题
- java实现 生产者和消费者问题 多线程同步示例
- 生产者与消费者问题
- 操作系统:生产者-消费者问题
- 用vc实现生产者消费者问题
- 生产者消费者问题的java实现
- 用vc实现生产者消费者问题
- 用JAVA 实现“生产者-消费者”问题
- 带信号量的生产者消费者问题
- 由生产者/消费者问题看JAVA多线程