线程资源同步对象-condition_variable

C++ 11提供了std::condition_variable这个类 代表条件变量,与Linux系统原生的条件变量一样,同时还提供了等待条件变量的一系列wait方法(wait/wait_for/wait_until),发送信号使用notify方法(notify_one/notify_all),使用std::condition_variable时需要绑定到std::unique_lock或std::lock_guard对象。

C++ 11中 std::condition_variable 不再需要显示调用方法初始化和销毁

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <iostream>
#include <mutex>
#include <shared_mutex>
#include <thread>
#include <stdio.h>
#include <list>


class Task {
public:
Task(int id) {
m_taskID = id;
}
~Task() = default;

void DoTask() {
std::cout << "do task,taskID:" << m_taskID << ", threadID:" << std::this_thread::get_id() << std::endl;
}
private:
int m_taskID;
};

std::mutex mutex;
std::condition_variable cv;
std::list<Task*> tasks;

void produce_thread() {
Task* pTask = NULL;
int taskID = 0;
while (1) {
pTask = new Task(taskID);
{
std::lock_guard<std::mutex> lg(mutex);
tasks.push_back(pTask);
std::cout << "produce a task,taskID:" << taskID << ",threadID:" << std::this_thread::get_id() << std::endl;
}
cv.notify_all();
taskID++;
std::this_thread::sleep_for(std::chrono::seconds(1));
}
return;
}

void consume_thread() {
Task* pTask = NULL;
int taskID = 0;
while (1) {
std::unique_lock<std::mutex> guard(mutex);
while (tasks.empty()) {
cv.wait(guard);
}
pTask = tasks.front();
tasks.pop_front();
if (pTask == NULL) {
continue;
}
pTask->DoTask();
delete pTask;
pTask = NULL;
}
return;
}


int main() {
std::thread consume1 = std::thread(consume_thread);
std::thread consume2 = std::thread(consume_thread);
std::thread consume3 = std::thread(consume_thread);
std::thread consume4 = std::thread(consume_thread);
std::thread consume5 = std::thread(consume_thread);

std::thread produce1 = std::thread(produce_thread);
//std::thread produce2 = std::thread(produce_thread);
//std::thread produce3 = std::thread(produce_thread);

consume1.join();
consume2.join();
consume3.join();
consume4.join();
consume5.join();
produce1.join();
//produce2.join();
//produce3.join();

system("pause");
return 0;
}
//output:
produce a task,taskID:0,threadID:19444
do task,taskID:0, threadID:6344
produce a task,taskID:1,threadID:19444
do task,taskID:1, threadID:6352
produce a task,taskID:2,threadID:19444
do task,taskID:2, threadID:4836
produce a task,taskID:3,threadID:19444
do task,taskID:3, threadID:6352
produce a task,taskID:4,threadID:19444
do task,taskID:4, threadID:6344
produce a task,taskID:5,threadID:19444
do task,taskID:5, threadID:4836
produce a task,taskID:6,threadID:19444
do task,taskID:6, threadID:13436
produce a task,taskID:7,threadID:19444
do task,taskID:7, threadID:4836
.........

本文标题:线程资源同步对象-condition_variable

文章作者:Tokey

发布时间:2020年05月20日 - 14:05

最后更新:2020年05月21日 - 16:05

原始链接:http://TokeyRoad.github.io/2020/05/20/线程资源同步对象-condition-variable/

许可协议: 转载请保留原文链接及作者。

0%