生产者,消费者 多线程
#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; }