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;
    }
    

      

  • 相关阅读:
    关于Delphi中RS Float字段只有4位及OADateTime不能显示到秒的解决办法
    xml特殊字符处理(js)
    总结一下最近将163邮箱拖动效果改成兼容Firefox遇到的问题
    在XIB里面关于@property,@synthesize,release,dealloc的怪现象
    关于Core Data里面删除了一个被retain的NSManagedObject
    Hello cnblogs' world!
    html5离线应用程序 Amy
    css3布局相关的样式 Amy
    html5拖放API Amy
    css3MediaQueries的相关样式 Amy
  • 原文地址:https://www.cnblogs.com/jjtx/p/6759605.html
Copyright © 2011-2022 走看看