dl
dl_thread_task.h
浏览该文件的文档.
1
12#pragma once
13
14#include <mutex>
15
16#include "system/dl_thread.h"
18
19namespace dl
20{
21
23template<typename T>
25{
26public:
27
28 using FnDoTask = std::function<void(T&)>;
29
30 void Init(FnDoTask fn_do_task, size_t thread_num = (size_t)std::thread::hardware_concurrency())
31 {
32 _list.Clear();
33
34 _fnDoTask = fn_do_task;
35 _bEnd = false;
36
37 _allThread.resize(thread_num);
38 for (auto& iter : _allThread)
39 {
40 iter = g_thread->Create();
41 iter->Start(std::bind(&MultiThreadTask::_thread_task, this), nullptr);
42 }
43 }
44
47 void AddTask(const T& task)
48 {
49 ++_numTask;
50 _list.Add(task);
51 }
52
55 void ClearTask()
56 {
57 // todo
58 /*_list.Clear();
59 _numDoTask = 0;*/
60 }
61
64 size_t GetTaskNum()
65 {
66 return _numTask;
67 }
68
72 void Wait()
73 {
74 _list.Move();
75 while (!_bEnd)
76 {
77 if (_list.IsEmpty() && _numTask == 0)
78 break;
79 std::this_thread::sleep_for(std::chrono::milliseconds(1));
80 }
81 }
82
84 {
85 _list.SetQueueMode(mode);
86 }
87
89 _numTask{ 0 }
90 {
91
92 }
93
95 {
96 _bEnd = true;
97 for (auto& iter : _allThread)
98 {
99 delete iter;
100 }
101 }
102private:
104 FnDoTask _fnDoTask;
105 std::atomic_int _numTask; // 剩余任务数
106 std::vector<Thread*> _allThread;
107 std::atomic_bool _bEnd;
108
109 void _thread_task()
110 {
111 while (!_bEnd)
112 {
113 std::this_thread::sleep_for(std::chrono::milliseconds(1));
114
115 T task;
116 if (_list.PopFront(task))
117 {
118 _fnDoTask(task);
119 --_numTask;
120 }
121 }
122 }
123};
124}
多线程队列(带缓冲)
bool PopFront(T &a)
取第一个,顺序通过 SetQueueMode 指定,默认FIFO
void AddTask(const T &task)
添加任务
void Wait()
等待任务完成(添加完成后再调用)
void ClearTask()
清除所有任务
std::function< void(T &)> FnDoTask
void Init(FnDoTask fn_do_task, size_t thread_num=(size_t) std::thread::hardware_concurrency())
size_t GetTaskNum()
返回剩余任务数量
void SetQueueMode(QueueMode mode)
多线程队列(带缓冲)
线程封装
ThreadManager * g_thread