markparticle / WebServer

C++ Linux WebServer服务器
Apache License 2.0
3.58k stars 733 forks source link

关于线程池的类内结构体 #70

Open Atreus1125 opened 1 year ago

Atreus1125 commented 1 year ago

将线程池信息存到结构体里面然后由子线程通过指针捕获的目的是什么呢?能否直接作为类的成员变量然后通过this指针传递给匿名函数。

kezhian commented 9 months ago

应该是提升代码可读性吧。 直接作为类的成员变量,通过this指针调用应该是没问题的

Cwj1212 commented 6 months ago

主要是防止线程池对象析构后,子线程异常的问题。 具体来说:线程池析构后,创建的线程仍然在运行,通过this指针调用会出现中断。而如果通过shared_ptr的话,线程池信息结构体指针通过值传递的方式传递给子线程,shared_ptr会增加引用计数,其并不会随着线程池析构。

peng-yq commented 5 months ago

将线程池信息存到结构体里面然后由子线程通过指针捕获的目的是什么呢?能否直接作为类的成员变量然后通过this指针传递给匿名函数。

因为这里是用的shared_ptr以及创建thread后就detach了,ThreadPool的生命周期可能先一步结束,那么使用this就会出现问题,而将其复制给pool,shared_ptr会增加计数,只有当计数为0时才释放资源。但这里detach好像有点问题,可以使用一个vector来管理工作线程,最后在析构函数中进行关闭,这种方式是可以直接使用this->pool_的