zoukankan      html  css  js  c++  java
  • c++ 生产者与消费者


    #include<iostream> #include<cstring> #include<algorithm> #include<thread> #include<mutex> #include<Windows.h> #include<condition_variable> using namespace std; const int buffer_size = 10;//缓冲区大小 const int num = 100;//要交互的商品个数 /* 说清楚,只有两个进程,生产者和消费者, 一个全局缓冲区,头指针l,尾指针r */ mutex aa; struct buff { int val[buffer_size]; int l, r; mutex mtx; condition_variable full, nofull; }buffer; void init(buff* chal) { chal->l = chal->r = 0; } void pr_do(buff* a, int item) {//添加item商品进入缓冲区 unique_lock<mutex>lock(a->mtx);//这句话的意思就是 执行这个函数的时候不能被别的进程打扰 while ((a->r + 1) % buffer_size == a->l) {//如果满了 cout << " 满了别加入了" << endl; (a->full).wait(lock);//暂时给a的缓冲区解锁,并且阻塞当前线程。(当wait函数return后继续上锁) } //可以加入 a->val[(a->r)] = item; a->r++; a->r %= buffer_size; //现在肯定有商品了,因为缓冲区空被阻塞的线程可以唤醒了 (a->nofull).notify_all(); lock.unlock(); } void user(); void porduce() {//生产商品的进程 for (int i = 1; i <= num; i++) { unique_lock<mutex>lock(aa); cout << " 放入商品" << i << endl; pr_do(&buffer, i); } } int user_do(buff* a) { unique_lock<mutex>lock(a->mtx);//这句话的意思就是 执行这个函数的时候不能被别的进程打扰 while (a->l == a->r) {//空 cout << "没有商品可以取" << endl; (a->nofull).wait(lock);//阻塞当前线程,解锁缓冲区 } int date = 0; date = a->val[a->l]; a->l++; a->l %= buffer_size; (a->full).notify_all(); lock.unlock(); return date; } void user() { int t = num; while (t) { Sleep(1); int date = user_do(&buffer); cout << "获得商品" << date << endl; t--; } } int main() { init(&buffer); thread prodece(porduce); thread user(user); prodece.join(); user.join(); return 0; }

     输出可能有不整齐的现象,是因为a线程回车输出之前就切换为了别的进程,导致错乱,但是不影响结果吧

    寻找真正的热爱
  • 相关阅读:
    【491】概率论与数理统计——宋浩 笔记
    【491】安装 keras_contrib 高级网络实现模块详细方法
    【490】Stanford POS tagger 实现及相关含义
    git中submodule子模块的添加、使用和删除
    IOS开发之----NSError错误信息
    一个基于SpringBoot + IView 的单体架构管理系统
    GPS经纬度坐标WGS84到东北天坐标系ENU的转换
    ubuntu循环登录问题解决
    固件错误Possible missing firmware解决办法
    crc校验
  • 原文地址:https://www.cnblogs.com/lesning/p/14444812.html
Copyright © 2011-2022 走看看