生产者,消费者 多线程

  

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

  

原文地址:https://www.cnblogs.com/jjtx/p/6759605.html