zoukankan      html  css  js  c++  java
  • 生产者,消费者 多线程

      

    #include <iostream>
    #include <vector>
    #include <thread>
    #include <mutex>
    
    const size_t SIZE = 10;
    using ElemTy = char;
    ElemTy arr[SIZE];
    
    size_t begin = 0;
    size_t end = 0;
    
    std::mutex prdc_m;
    std::mutex cnsm_m;
    
    void produce() {
      for (;;) {
        if ((end + 1) % SIZE != begin) {
          {
            std::lock_guard<std::mutex> lg(prdc_m);
            arr[end] = 'o';
            end = (end + 1) % SIZE;
            std::cout << "produce and size is " << (end - begin) % SIZE << std::endl;
          }
        }
      }
    }
    
    void consume() {
      for (;;) {
        if (begin != end) {
          ElemTy e;
          {
            std::lock_guard<std::mutex> lg(cnsm_m);
            e = arr[begin];
            begin = (begin + 1) % SIZE;
            std::cout << "consume and size is " << (end - begin) % SIZE << std::endl;
          }
        }
      }
    }
    
    int main() {
      std::vector<std::thread> vc;
      std::vector<std::thread> vp;
      for (int i = 0; i < 10; ++i) {
        vc.push_back(std::thread(consume));
      }
      for (int i = 0; i < 10; ++i) {
        vp.push_back(std::thread(produce));
      }
    
      for (auto &t : vc) {
        t.join();
      }
    
      for (auto &t : vp) {
        t.join();
      }
    
      return 0;
    }
    #include <iostream>
    #include <vector>
    #include <thread>
    #include <mutex>
    
    class ConcurrentQueue {
      using ElemTy = char;
      static const size_t SIZE = 10;
      ElemTy arr[SIZE];
    
      size_t begin = 0;
      size_t end = 0;
    
      std::mutex prdc_m;
      std::mutex cnsm_m;
    
    public:
      void produce() {
        for (;;) {
          if ((end + 1) % SIZE != begin) {
            {
              std::lock_guard<std::mutex> lg(prdc_m);
              arr[end] = 'o';
              end = (end + 1) % SIZE;
              std::cout << "produce and size is " << (end - begin) % SIZE << std::endl;
            }
          }
        }
      }
    
      void consume() {
        for (;;) {
          if (begin != end) {
            ElemTy e;
            {
              std::lock_guard<std::mutex> lg(cnsm_m);
              e = arr[begin];
              begin = (begin + 1) % SIZE;
              std::cout << "consume and size is " << (end - begin) % SIZE << std::endl;
            }
          }
        }
      }
    };
    
    int main() {
      std::vector<std::thread> vc;
      std::vector<std::thread> vp;
      ConcurrentQueue Q;
      for (int i = 0; i < 10; ++i) {
        vc.push_back(std::thread(&ConcurrentQueue::consume, std::ref(Q)));
      }
      for (int i = 0; i < 10; ++i) {
        vp.push_back(std::thread(&ConcurrentQueue::produce, std::ref(Q)));
      }
    
      for (auto &t : vc) {
        t.join();
      }
    
      for (auto &t : vp) {
        t.join();
      }
    
      return 0;
    }
    

      

  • 相关阅读:
    农夫带着狼、羊和一棵白菜过河
    C#实现L型棋牌覆盖
    数据库存储管理
    4个人打算过桥,它们都在桥的某一端,.我们有17分钟让他们全部到达大桥的另一头?
    C# 创建Public无参构造函数的快捷键
    控制文件管理
    配置数据库
    C#实现线性查找(递归,非递归)
    C#实现选择排序
    C#4.0参数默认值
  • 原文地址:https://www.cnblogs.com/jjtx/p/6759605.html
Copyright © 2011-2022 走看看