dl
dl
io
dl_thread_task.h
浏览该文件的文档.
1
12
#pragma once
13
14
#include <mutex>
15
16
#include "
system/dl_thread.h
"
17
18
namespace
dl
19
{
20
21
enum class
QueueMode
22
{
23
FIFO
,
24
FILO
,
25
};
26
28
template
<
typename
T>
29
class
MultiThreadTask
30
{
31
public
:
32
33
using
FnDoTask
= std::function<void(
const
T
&)>;
34
35
void
Init
(
FnDoTask
fn_do_task,
36
QueueMode
mode =
QueueMode::FIFO
,
37
size_t
thread_num = (
size_t
)std::thread::hardware_concurrency())
38
{
39
_mutexTask.lock();
40
_vecTaskTemp.clear();
41
_vecTask.clear();
42
_mutexTask.unlock();
43
44
_fnDoTask = fn_do_task;
45
_bEnd =
false
;
46
_mode = mode;
47
48
_allThread.resize(thread_num);
49
for
(
auto
& iter : _allThread)
50
{
51
iter =
g_thread
->Create();
52
iter->Start(std::bind(&MultiThreadTask::_thread_task,
this
),
nullptr
);
53
}
54
}
55
58
void
AddTask
(
const
T
& task)
59
{
60
if
(_mutexTask.try_lock())
61
{
62
_vecTask.splice(_vecTask.begin(), _vecTaskTemp);
63
_vecTask.push_back(task);
64
_mutexTask.unlock();
65
return
;
66
}
67
_vecTaskTemp.push_back(task);
68
}
69
72
void
ClearTask
()
73
{
74
_mutexTask.lock();
75
_vecTaskTemp.clear();
76
_vecTask.clear();
77
_mutexTask.unlock();
78
}
79
83
void
Wait
()
84
{
85
while
(!_bEnd)
86
{
87
_mutexTask.lock();
88
if
(_vecTask.empty())
89
{
90
_mutexTask.unlock();
91
break
;
92
}
93
_mutexTask.unlock();
94
std::this_thread::sleep_for(std::chrono::milliseconds(1));
95
}
96
}
97
98
~MultiThreadTask
()
99
{
100
_bEnd =
true
;
101
for
(
auto
& iter : _allThread)
102
{
103
delete
iter;
104
}
105
}
106
private
:
107
std::list<T> _vecTaskTemp;
// 当前任务临时队列
108
std::list<T> _vecTask;
// 当前任务
109
std::mutex _mutexTask;
110
FnDoTask
_fnDoTask;
111
std::vector<Thread*> _allThread;
112
std::atomic_bool _bEnd;
113
QueueMode
_mode;
114
115
void
_thread_task()
116
{
117
while
(!_bEnd)
118
{
119
std::this_thread::sleep_for(std::chrono::milliseconds(1));
120
121
_mutexTask.lock();
122
if
(_vecTask.empty())
123
{
124
_mutexTask.unlock();
125
continue
;
126
}
127
T
task;
128
if
(_mode ==
QueueMode::FIFO
)
129
{
130
task = _vecTask.front();
131
_vecTask.pop_front();
132
}
133
else
134
{
135
task = _vecTask.back();
136
_vecTask.pop_back();
137
}
138
_mutexTask.unlock();
139
140
_fnDoTask(task);
141
}
142
}
143
};
144
}
dl::MultiThreadTask
多线程任务
定义
dl_thread_task.h:30
dl::MultiThreadTask::~MultiThreadTask
~MultiThreadTask()
定义
dl_thread_task.h:98
dl::MultiThreadTask::AddTask
void AddTask(const T &task)
添加任务
定义
dl_thread_task.h:58
dl::MultiThreadTask::Wait
void Wait()
等待任务完成
定义
dl_thread_task.h:83
dl::MultiThreadTask::ClearTask
void ClearTask()
清除所有任务
定义
dl_thread_task.h:72
dl::MultiThreadTask::FnDoTask
std::function< void(const T &)> FnDoTask
定义
dl_thread_task.h:33
dl::MultiThreadTask::Init
void Init(FnDoTask fn_do_task, QueueMode mode=QueueMode::FIFO, size_t thread_num=(size_t) std::thread::hardware_concurrency())
定义
dl_thread_task.h:35
dl_thread.h
线程封装
dl
定义
dl_array.h:22
dl::KeyCode::T
@ T
定义
dl_input.h:121
dl::QueueMode
QueueMode
定义
dl_thread_task.h:22
dl::QueueMode::FILO
@ FILO
定义
dl_thread_task.h:24
dl::QueueMode::FIFO
@ FIFO
定义
dl_thread_task.h:23
dl::g_thread
ThreadManager * g_thread
制作者
1.13.1