【Linux操作系统】--多线程(二)--条件变量

目录

Linux线程同步

条件变量

条件变量的作用:

条件变量的用法:

条件变量简单案例:

为什么pthread_cond_wait需要互斥量?

生产者消费者模型

为何要使用生产者消费者模型

生产者消费者模型优点

基于BlockingQueue的生产者消费者模型

C++ queue模拟阻塞队列的生产消费模型

复盘生产者消费者问题

POSIX信号量

1.回顾信号量的概念

2.认识信号量对应的操作函数

3.认识环形队列

4.结合sem+环形队列编写生产消费模型


Linux线程同步

条件变量

什么是条件变量:

条件变量是利用线程间共享的全局变量进行同步的一种机制。主要包括两种动作:

  • 线程等待条件变量的成立而挂起
  • 另一个线程使条件变量成立而通知其它线程。

这个怎么理解呢?举个例子:当你去超市买手机,问售货员有没有苹果13,售货员需要在苹果13到的时候才知道有没有苹果13,那么你需要等待售货员的通知,这个时候你是被挂起的,在wait售货员;同时当苹果13到店里的时候,售货员知道了有苹果13,条件成立了,售货员通知你苹果13到了,这个时候就是发信号signal的时候。

一般条件变量需要与互斥锁同时使用,那么互斥锁的用处在下面的例子有讲到。

条件变量的作用:

使用条件变量可以以原子方式阻塞线程,直到某个特定条件为真为止,条件变量一般是与互斥锁一起使用的,对条件变量的测试一般是在互斥锁的保护下进行的。

条件变量的用法:

初始化:

条件变量的初始化和创建进程初始化一摸一样,只是换了个名字,条件变量初始化也包括动态初始化和静态初始化

动态初始化

int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t *restrict attr); 参数:

cond:要初始化的条件变量

attr:NULL--设置条件变量属性,一般设置为NULL即可

返回值:

成功返回0,失败返回错误码

静态初始化:

pthread_cond_t cond=PTHREAD_COND_INITIALIZER;

销毁:

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); //唤醒所有进程

int pthread_cond_signal(pthread_cond_t *cond);       //唤醒一个进程

条件变量简单案例:

思路:

创建一个master线程和3个worker线程,master线程用来发送信号signal,worker的每个线程接收到master线程信号开始做自己的动作。

主函数中的主线程工作:初始化(线程,条件变量),创建线程,等待线程,销毁。

两个新线程的动作:master状态就绪发送信号,唤醒等待队列中的线程,worker线程阻塞等待接收信号,再做动作。我们使用了pthread_cond_signal唤醒队列中的线程,那么唤醒的是哪一个呢?唤醒的是队列中第一个线程。

#include <iostream>
#include <string>
#include <pthread.h>
#include <unistd.h>
using namespace std;

pthread_mutex_t mtx;//互斥锁
pthread_cond_t cond;//条件变量

void* ctrl(void* args)
{
    std::string name=(char*)args;
    while(true)
    {
        std::cout<<"master say:
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值