dl
dl_thread.h
浏览该文件的文档.
1
10#pragma once
11
12#include <list>
13#include <functional>
14#include <thread>
15#include <cassert>
16#include <atomic>
17
18#include "io/dl_log.h"
19
20namespace dl
21{
22
23// 状态 -1未开始 0执行中 1结束
24// Start -1 -> 0
25// 完成 0 -> 1
26// Clear 1 -> -1
27
29class Thread
30{
31 friend class ThreadManager;
32public:
33 void Start(std::function<void(void*)> func, void* user_data)
34 {
35 if (_state != -1)
36 {
37 log_err("线程不是初始状态,不能再次运行!");
38 return;
39 }
40 _func = func;
41 _userData = user_data;
42 _t = std::thread{ _run, this };
43 _t.detach();
44 }
45 void Clear()
46 {
47 if (_state == -1)
48 return;
49 if (_state == 0)
50 {
51 log_err("线程未完成,不能重置状态!");
52 return;
53 }
54 _state = -1;
55 _func = nullptr;
56 _userData = nullptr;
57 }
58 // 强行结束
59 void Terminate();
60
61 int GetState() { return _state; }
62 bool IsWork() { return _state == 0; }
63 bool IsFinish() { return _state == 1; }
65private:
66 Thread() :
67 _state{ -1 },
68 _userData{ nullptr }
69 {}
70
71 std::atomic_int _state;// -1未开始 0执行中 1结束
72 std::function<void(void*)> _func;
73 std::thread _t;
74 void* _userData;
75 static void _run(Thread* t)
76 {
77 t->_state = 0;
78 t->_func(t->_userData);
79 t->_state = 1;
80 }
81};
82
83// 线程管理
84// 1.创建线程对象
85// 2.运行线程(传入函数、自定义数据)
86// 3.删除线程对象
87
90{
91public:
93 {
94 Thread* ret = new Thread;
95 _allThread.push_back(ret);
96 return ret;
97 }
101 {
102 }
103
105 {
106 auto iter = std::find(_allThread.begin(), _allThread.end(), t);
107 if (iter == _allThread.end())
108 {
109 assert(0);
110 return;
111 }
112 _allThread.erase(iter);
113 }
114private:
115 std::list<Thread*> _allThread;
116};
117extern ThreadManager* g_thread;
118}
119
void Terminate()
void Start(std::function< void(void *)> func, void *user_data)
friend class ThreadManager
void _remove_ref(Thread *t)
日志系统
#define log_err(...)
ThreadManager * g_thread