例说生产者和消费者模型

什么是生产者和消费者模型

什么是生产者消费者模型?生产者和消费是操作系统中一种重要的模型,它描述的是一种等待和通知的机制,如下图。
(生产者和消费者模型)


生产者和消费者模型必须具有的条件

用一句话概括,生产者消费者模型必须具有的条件是三种关系,两类角色,一类交易场所
一类交易场所:交易场所指的是生产者和消费者之间进行数据交换的仓库,这块仓库相当于一个缓冲区,生产者负责把数据放入到缓冲区中,消费者负责把缓冲区中的数据取出来;
两类角色:指的是生产者和消费者;
三种关系:三种关系分别指的是:消费者和消费者,生产者和生产者,生产者和消费者;其中消费者和消费者,生产者和生产者之间都属于竞争关系,生产者和消费者之间的关系相当于是一种食物链之间的依赖关系。

生产者和消费者模型的特点

  1. 首先,生产者只需要关心“仓库”,并不需要关心具体的消费者。
  2. 对于消费者而言,它不需要关心具体的生产者,它只需要关心这个“仓库”中还有没有东西存在。
  3. 生产者生产的时候消费者不能进行“消费”,消费者消费的时候生产者不能生产,相当于一种互斥关系,即生产者和消费者一次只能有一人能访问到“仓库”。
  4. “仓库”为空时不能进行消费。
  5. “仓库”满时不能进行生产。

什么是条件变量

条件变量是线程可用的一种同步机制,它给多个线程提供了一个会合的场所,与互斥量一起使用时,允许线程以无竞争的方式等待特定条件发生。
条件本身是由互斥量保护的,线程在该变条件状态之前必须首先锁住互斥量,使临界区域只能被当前访问资源的线程所独有,其他线程在访问临界区域获得互斥量之前不会察觉到这种改变,因为互斥量必须在锁定以后才能计算条件

条件变量的类型:pthread_cond_t
条件变量的初始化:条件变量的初始化有两种方法,1.可以使用PTHREAD_COND_INITIALIZER宏来进行初始化。2.可以使用pthread_cond_init函数来进行初始化。

条件变量的初始化函数和摧毁函数

  int pthread_cond_destroy(pthread_cond_t *cond);

int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);
//两个函数都是成功返回0,失败则返回错误码

条件变量的操作函数

       int pthread_cond_timedwait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex,const struct timespec *restrict abstime);

       int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);

       //两个函数都是成功返回0,失败则返回错误码

pthread_cond_wait

该函数用来使用传递给它的互斥量来对条件进行保护,它主要做下面的事情:
1. 把调用线程放到等待条件的线程列表上;
2. 对互斥量进行解锁;
3. 函数返回时,互斥量再次被锁住。

pthread_cond_timewait

相比于上面的wait函数,timewait函数只是做了超时检查,超时值abstime指定了我们愿意等待多长时间.这个时间是一个绝对数.
如果超时了,等待的条件还是

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
条件变量和互斥锁通常用于实现生产者消费者模型。在生产者消费者模型中,有两类线程生产者线程消费者线程生产者线程负责生产数据并将其存储在共享内存区域中,而消费者线程负责读取这些数据并进行处理。 下面是一个简单的生产者消费者模型的C++代码示例: ```c++ #include <iostream> #include <thread> #include <mutex> #include <condition_variable> #include <queue> std::mutex mtx; std::condition_variable cv; std::queue<int> q; void producer() { for(int i = 0; i < 10; i++) { std::unique_lock<std::mutex> lck(mtx); // 获取互斥锁 q.push(i); // 生产数据 cv.notify_one(); // 通知消费者线程 } } void consumer() { while(true) { std::unique_lock<std::mutex> lck(mtx); // 获取互斥锁 cv.wait(lck, []{ return !q.empty(); }); // 等待条件变量成立 int data = q.front(); // 获取数据 q.pop(); // 删除数据 std::cout << "Consumed: " << data << std::endl; // 处理数据 } } int main() { std::thread t1(producer); std::thread t2(consumer); t1.join(); t2.join(); return 0; } ``` 在上面的代码中,producer函数是生产者线程,它将0到9的整数生产并存储在队列q中。consumer函数是消费者线程,它等待条件变量成立,即等待队列q非空,然后获取队列的第一个元素,并将其从队列中删除。在本例中,我们只是简单地打印出消费的数据。 在主函数中,我们创建了两个线程,一个是生产者线程,另一个是消费者线程。我们使用join()方法等待两个线程完成执行。 这是一个简单的生产者消费者模型的实现,使用条件变量和互斥锁可以实现线程之间的同步,避免了竞争条件和死锁等问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值