目录
一、线程同步的含义及相关接口
1.1条件变量
当一个线程互斥地访问某个变量时,它可能发现在其它线程改变状态之前,它什么也做不了。
例如一个线程访问队列时,发现队列为空,它只能等待,只到其它线程将一个节点添加到队列中。这种情况就需要用到条件变量。
1.2同步概念与竞态条件
同步:在保证数据安全的前提下,让线程能够按照某种特定的顺序访问临界资源,从而有效避免饥饿问题,叫做同步。
竞态条件:因为时序问题,而导致程序异常,我们称之为竞态条件。在线程场景下,这种问题也不难理解。
1.4条件变量相关接口
定义条件变量:
pthread_cond_t cond=PTHREAD_COND_INITIALIZER;定义一个全局条件变量
初始化:
int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t
*restrictattr);
参数:
cond:要初始化的条件变量
attr:NULL
销毁:
int pthread_cond_destroy(pthread_cond_t *cond)
等待条件满足:
int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t
*restrict mutex);
参数:
cond:要在这个条件变量上等待
mutex:互斥量,后面详细解释
唤醒等待:
int pthread_cond_broadcast(pthread_cond_t *cond);唤醒所有cond等待的线程
int pthread_cond_signal(pthread_cond_t *cond);唤醒一个cond等待的线程
如果唤醒成功返回0,失败返回错误码
二、生产消费者模型
2.1为何要使用生产者消费者模型
生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个阻塞队列就是用来给生产者和消费者解耦的。
2.2 生产者消费者模型优点
为什么生产消费者模型可以提供比较好的并发度:
1、解耦
2、支持并发
3、支持忙闲不均
2.3 基于BlockingQueue的生产者消费者模型
在多线程编程中阻塞队列
(Blocking Queue)
是一种常用于实现生产者和消费者模型的数据结构。其与普通的队列区别在于,当队列为空时,从队列获取元素的操作将会被阻塞,直到队列中被放入了元素;当队列满时,往队列里存放元素的操作也会被阻塞,直到有元素被从队列中取出(
以上的操作都是基于不同的线程来说的,线程在对阻塞队列进程操作时会被阻塞)。
而此队列作为消费者和生产者所共同访问的中间资源,属于临界区资源,所以对此队列进行访问时需要持锁进行访问,这也就是在等待条件满足时为什么要将锁进行传参的原因。当持有锁并且满足条件时就可以对其进行访问。
2.4生产消费者模型的321
3即3种关系:生产者与生产者之间,其关系是互斥||同步。
消费者与消费者之间,其关系是互斥||同步。
生产者与消费者之间,其关系是互斥&&同步。
2即2种角色:生产者角色和消费者角色。
1即一个交易场所:超市。
而超市就是我们所提出的共享资源即临界资源,也就是临时保存数据的内存空间或某种数据结构对象,而在生产消费者模型种相互交易的商品就是数据。