阿里內推二面編程題:實現一個生成者消費者模型ios
要求:
一、多線程生產者、多線程消費者
二、當隊列超過>100時,生產者中止生產,隊列<20,消費者中止消費
三、適當加一些print來驗證你的程序,否則整個程序跑起來,你是不知道程序是什麼狀況的編程
1 /* Hello World program */ 2 3 #include <iostream> 4 5 #include <queue> 6 #include <mutex> 7 #include <condition_variable> 8 #include <thread> 9 #include <functional> 10 11 //幾個要求 12 //一、多線程生產者、多線程消費者 13 //二、當隊列超過>100時,生產者中止生產,隊列<20,消費者中止消費 14 //三、適當加一些print來驗證你的程序,否則整個程序跑起來,你是不知道程序是什麼狀況的 15 16 17 std::queue<int> q; 18 std::mutex m; 19 std::condition_variable cv1; //for 100; 20 std::condition_variable cv2; //for 20; 21 22 void produce(int x){ 23 std::unique_lock<std::mutex> lck(m); 24 //cycle check. 25 while(q.size()>100){ 26 cv1.wait(lck); 27 } 28 q.push(x); 29 std::cout << "produce:" << x << std::endl; 30 if(q.size()>=20) cv2.notify_all(); 31 } 32 33 void consume(){ 34 std::unique_lock<std::mutex> lck(m); 35 while(q.size()<20) cv2.wait(lck); 36 37 std::cout << "consume:" << q.front() << std::endl; 38 q.pop(); 39 if(q.size()<100) cv1.notify_all(); 40 } 41 42 43 int main() 44 { 45 std::thread producers[200]; 46 for(int i=0;i<200;i++){ 47 producers[i]=std::thread(produce,i); 48 } 49 50 std::thread consumers[200]; 51 for(int i=0;i<200;i++){ 52 consumers[i] = std::thread(consume); 53 } 54 55 for(auto& p : producers){ 56 p.join(); 57 } 58 for(auto& c : consumers){ 59 c.join(); 60 } 61 62 //std::cout << "Hello World!"; 63 return 0; 64 }