dl
dl_thread_task.h
浏览该文件的文档.
1
12#pragma once
13
14#include <mutex>
15
16#include "system/dl_thread.h"
17
18namespace dl
19{
20
21 enum class QueueMode
22 {
25 };
26
28template<typename T>
30{
31public:
32
33 using FnDoTask = std::function<void(const T&)>;
34
35 void Init(FnDoTask fn_do_task,
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
99 {
100 _bEnd = true;
101 for (auto& iter : _allThread)
102 {
103 delete iter;
104 }
105 }
106private:
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}
void AddTask(const T &task)
添加任务
void Wait()
等待任务完成
void ClearTask()
清除所有任务
std::function< void(const T &)> FnDoTask
void Init(FnDoTask fn_do_task, QueueMode mode=QueueMode::FIFO, size_t thread_num=(size_t) std::thread::hardware_concurrency())
线程封装
ThreadManager * g_thread