线程池核心设计
线程池是一种复用线程资源的设计模式。线程数量过多会显著增加调度开销,影响缓存局部性和整体性能;而线程池维护一组固定或动态的线程,等待任务分配。这避免了为短时间任务频繁创建和销毁线程的代价,既能保证内核资源的充分利用,又能防止过度调度。
适用场景
- 短耗时任务:如 Web 服务器处理 HTTP 请求。单个任务小但并发量巨大,线程池能避免上下文切换带来的性能损耗。
- 高响应要求:对延迟敏感的应用,需要服务器迅速响应客户请求。
- 突发流量:接受突发性大量请求但不希望因此产生海量线程导致内存耗尽的场景。
线程封装与管理
线程池的核心在于对线程的生命周期管理(创建、控制、回收)。我们需要一个能够描述线程状态并支持组织调度的基础类。
基于 pthread 封装的 Thread 类如下,它负责绑定执行函数、启动线程以及获取线程 ID:
#define get_lwp_id() syscall(SYS_gettid)
using func_t = std::function<void(const std::string&name)>;
const std::string threadnamedefault = "None-Name";
class Thread {
public:
Thread(func_t func, const std::string &name = threadnamedefault)
: _name(name), _func(func), _isrunning(false) {
LOG(LogLevel::INFO) << _name << " create thread obj success";
}
static void *start_routine(void *args) {
Thread *self = static_cast<Thread *>(args);
self->_isrunning = true;
self->_lwpid = get_lwp_id();
self->_func(self->_name);
pthread_exit((void *)0);
}
void Start() {
int n = (&_tid, , start_routine, );
(n == ) {
(LogLevel::INFO) << _name << ;
}
}
{
n = (_tid);
()n;
}
{
(!_isrunning) ;
n = (_tid, );
(n == ) {
(LogLevel::INFO) << _name << ;
}
}
:
_isrunning;
_tid;
_lwpid;
std::string _name;
_func;
};



