http://baptiste-wicht.com/posts/2012/04/c11-concurrency-tutorial-advanced-locking-and-condition-variables.html
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 |
struct
BoundedBuffer { int* buffer; int
capacity; int
front; int
rear; int
count; std::mutex lock; std::condition_variable not_full; std::condition_variable not_empty; BoundedBuffer(int
capacity) : capacity(capacity), front(0), rear(0), count(0) { buffer = new
int[capacity]; } ~BoundedBuffer(){ delete[] buffer; } void
deposit(int
data){ std::unique_lock<std::mutex> l(lock); not_full.wait(l, [this](){return
count != capacity; }); buffer[rear] = data; rear = (rear + 1) % capacity; ++count; not_empty.notify_one(); } int
fetch(){ std::unique_lock<std::mutex> l(lock); not_empty.wait(l, [this](){return
count != 0; }); int
result = buffer[front]; front = (front + 1) % capacity; --count; not_full.notify_one(); return
result; }}; |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 |
#include <iostream>#include <thread>#include <mutex>#include <condition_variable>//using namespace std;void
consumer(int
id, BoundedBuffer& buffer){ for(int
i = 0; i < 50; ++i){ int
value = buffer.fetch(); std::cout << "Consumer "
<< id << " fetched "
<< value << std::endl; std::this_thread::sleep_for(std::chrono::milliseconds(250)); }}void
producer(int
id, BoundedBuffer& buffer){ for(int
i = 0; i < 75; ++i){ buffer.deposit(i); std::cout << "Produced "
<< id << " produced "
<< i << std::endl; std::this_thread::sleep_for(std::chrono::milliseconds(100)); }}int
main(){ BoundedBuffer buffer(200); std::thread
c1(consumer, 0, std::ref(buffer)); std::thread
c2(consumer, 1, std::ref(buffer)); std::thread
c3(consumer, 2, std::ref(buffer)); std::thread
p1(producer, 0, std::ref(buffer)); std::thread
p2(producer, 1, std::ref(buffer)); c1.join(); c2.join(); c3.join(); p1.join(); p2.join(); return
0;} |
c++11 条件变量 生产者-消费者 并发线程,布布扣,bubuko.com
原文地址:http://www.cnblogs.com/bigben0123/p/3753148.html