关于多线程的消费者生产者模型
这几天,勉强看了C++的多线程的知识,对多线程有了一定的了解,然后在多次测试下写了消费者和生产者的模型。
好了,直接贴代码;
#include <windows.h> #include <mutex> #include <condition_variable> #include <iostream> #include <thread> using namespace std; static const int kItemRepositorySize = 10; static const int kItemsToProduce = 1000; struct Item { int item_buffer[kItemRepositorySize]; UINT write_position = 0; UINT read_position = 0; UINT produce_list = 0; UINT consume_list = 0; mutex mtx; mutex produce_mtx; mutex consume_mtx; condition_variable not_full; condition_variable not_empty; }item; //static Item item; void produce_do(int i){ unique_lock<mutex> lock(item.mtx); while ((item.write_position + 1) % kItemRepositorySize == item.read_position) { cout << "wait for the consume!" << endl; (item.not_full).wait(lock); } item.item_buffer[item.write_position] = i; item.write_position++; if (item.write_position == kItemRepositorySize) item.write_position = 0; item.not_empty.notify_all(); lock.unlock(); } void produce(){ while (true) { unique_lock<mutex> lock(item.produce_mtx); if (item.produce_list < kItemsToProduce) produce_do(item.produce_list); else { break; } item.produce_list++; lock.unlock(); } } void consume_do(){ unique_lock<mutex> lock(item.mtx); while (item.read_position == item.write_position) { cout << "it's time to produce!"; (item.not_empty).wait(lock); } cout << "the prodece is :" << item.item_buffer[item.read_position] << endl; item.read_position++; if (item.read_position == kItemRepositorySize) item.read_position = 0; item.not_full.notify_all(); lock.unlock(); } void consume(){ while (true) { unique_lock<mutex> lock(item.consume_mtx); if (item.consume_list < kItemsToProduce) consume_do(); else break; item.consume_list++; lock.unlock(); } } int main(){ //Item ItemRepository; //cout << ItemRepository.read_position; thread producer1(produce); thread producer2(produce); thread consumer1(consume); thread consumer2(consume); producer1.join(); producer2.join(); consumer1.join(); consumer2.join(); return 0; }
这是我所编得程序,在vs2015上已经测试过了;
有什么不懂的可以私信我;