行业知识
【Linux】线程同步 -- 条件变量 | 生产者消费者模型 | 自旋锁 |读写锁
2026-11-04 12:29:26
来源:互联网转载
- 初识生产者消费者模型
- 同步
- 条件变量
- 初步使用
- POSIX信号量
- 其他常见的各种锁
- 自旋锁
- 读写锁
初识生产者消费者模型
��一个例子:
学生去超市消费的时候,与厂家生产的时候,两者互不相冲突。
生产的过程与消费的过程 – 解耦
临时的保存产品的场所(超时) – 缓冲区
模型总结“321”原则:
- 3种关系:生产者和生产者(互斥),消费者和消费者(互斥),生产者和消费者(互斥[保证共享资源的安全性] && 同步) – 产品(数据)
- 2种角色:生产者线程,消费者线程
- 1个交易场所:一段特定结构的缓冲区
只要我们想写生产消费模型,我们本质工作其实就是维护321原则!
特点:
- 生产线程和消费线程进行解耦
- 支持生产和消费的一段时间的忙闲不均的问题
- 提高效率
举例:
我们以前:main函数获取用户输入,然后调用fun函数,fun函数执行,打印结果。这是一个串行的流程,现在我们对应生产者消费者模型:
同步
条件变量
由于上述的原因,我们不能仅靠锁来去实现线程互斥。
什么是条件变量:
- 当一个线程互斥地访问某个变量时,它可能发现在其它线程改变状态之前,它什么也做不了。(比如我们抢票,如果目前还没有票,那么每个人都是做同样的动作:加锁→判断票是否为0→解锁,在还没有放票之前,每个人都什么也做不了)
- 例如一个线程访问队列时,发现队列为空,它只能等待,只到其它线程将一个节点添加到队列中。这种情况就需要用到条件变量。
感性认识条件变量:
模拟一个面试流程:
1.假如我们一堆人都要到一家公司面试,但是这个公司的HR组织的不行,每次面试都是一堆人举手来竞争面试机会,都说要自己先来,而HR也是看谁顺眼就让他进去面试 – 一份共享资源被多线程并发式的竞争
2.同样是面试,而HR组织的好,说要面试必须要到等待区等待,按照排队顺序来:(这个等待区就是一个条件变量)
当条件不满足的时候,我们线程必须去某些定义好的条件变量上进行等待!
初步使用
#include #include #include #include int tickets = 1000;pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;pthread_cond_t cond = PTHREAD_COND_INITIALIZER;void *start_routine(void *args){ std::string name = static_cast(args); while (true) { pthread_mutex_lock(&mutex); pthread_cond_wait(&cond, &mutex); // 为什么要有mutex,后面就说 // 判断暂时省略 std::cout // 通过条件变量控制线程的执行 pthread_t t[5]; for (int i = 0; i