阿里面試:生產者消費者模型

阿里內推二面編程題:實現一個生成者消費者模型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 }
相關文章
相關標籤/搜索