1.1条件变量

int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t*restrict attr);参数:cond:要初始化的条件变量attr:NULL
int pthread_cond_destroy(pthread_cond_t *cond)
int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrictmutex);参数:cond:要在这个条件变量上等待mutex:互斥量,等待期间解锁,唤醒时再次加锁
int pthread_cond_broadcast(pthread_cond_t *cond);int pthread_cond_signal(pthread_cond_t *cond);
1.4 生产者消费者模型
生产者消费者模型的优点:(1)解耦合 (2)支持并发 (3)支持忙先不均
1.5基于BlockingQueue的⽣产者消费者模型
简单示例:
这里封装了一个BlockQue类,成员变量说明:定义了最大容量,一个互斥锁,生产者与消费者应该是互斥的,否则会导致数据错乱,设置了两个条件变量分别在队列为空和满的时候使线程进入等待,当队列有元素或不为空时由生产者或消费者线程根据wait_nums来决定是否唤醒对应的等待线程。成员函数说明:生产者与生产者之间,消费者与消费者是互斥的,所以在进入生产和消费的时候只允许一个线程进入,队列为空或满时都会进入等待,此时为了防止伪唤醒使用while循环来控制。(伪唤醒的情况:直接使用pthread_cond_broadcast唤醒所有的生产线程,但是此时只能有一个线程拿到锁,其他线程苏醒了但是还在等待锁,如果使用if判断满的话如果下一次锁还是被生产者拿到,此时队列还是满的,但是接拿到锁的线程还会继续插入发生错误,使用while就是为了在伪唤醒以后多加一次判断,如果条件没有达到继续进入条件等待。)
1.6为什么 pthread_cond_wait 需要互斥量?
1.7条件变量的封装
2.POSIX信号量
POSIX信号量和SystemV信号量作⽤相同,都是⽤于同步操作,达到⽆冲突的访问共享资源⽬的,但POSIX可以⽤于线程间同步。
#include <semaphore.h>int sem_init(sem_t *sem, int pshared, unsigned int value);参数:pshared:0表⽰线程间共享,⾮零表⽰进程间共享value:信号量初始值
int sem_destroy(sem_t *sem);
功能:等待信号量,会将信号量的值减1int sem_wait(sem_t *sem); //P()
功能:发布信号量,表⽰资源使⽤完毕,可以归还资源了。将信号量值加1。int sem_post(sem_t *sem);//V()
2.2基于环形队列的⽣产消费模型
环形队列的⽣产消费模型代码示例:
Sem封装
RingBuffer.hpp
这里将Mutex和封装好的Sem都应用了,需要查看具体及测试代码的同学可以在我的gitee仓库下的RingBuffer文件夹获取,该项目单生产单消费以及多生产多消费都是支持的,生产与消费之间是并发的,相较于阻塞队列生产者消费者模型提高了效率。
我的gitee仓库https://gitee.com/toutie40/study_code.git
本文到此结束,感谢大家观看,希望对你有所帮助,有错误请多多指教。