作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我不确定如何以任何方式在这个论坛中提出这个问题,希望能得到一些意见。
我正在为我的项目编写一个线程池。我有以下设计。
我正在维护线程 vector std::vector<ThreadWrapper <threadFuncParam>* > m_vecThreads;
并将线程插入列表 m_vecThreads.push_back(pThreadWrapper);
当新请求到来时,我使用如下的线程池
if(!m_vecThreads.empty() )
{
ThreadWrapper <threadFuncParam>* pWrapper = m_vecThreads.back();
m_vecThreads.pop_back();
//... Awake threadd
}
当线程作业完成后,它会被推回线程池。
现在,虽然正常关闭,但我现在已经通过上面的设计优雅地停止了线程,我面临着如何停止线程的问题,就像在 vector 容器中一样,当请求得到服务时,我从 vector 中弹出,所以我丢失了指针,直到服务完成.有没有更好的方法可以做到这一点或处理这种情况,例如标准 C++ 支持的 map 或其他容器?
另一个问题是
在关闭期间,我有一个场景线程正在这里进行处理,在我的情况下,从数据库读取这可能需要时间,所以我不能等到它完成并且我想向客户端发送对正在处理的线程正在处理的未决请求的回复,我即将终止该值是错误的。
谢谢!
最佳答案
如果您仍然需要使用从池中传出的东西,那么您应该将这些元素存放在“用过”的容器中。
但是,此时你正在分享你的指针,所以你应该使用shared_ptr并传递weak_ptr,这样线程也可以被删除并且用户没有悬空指针
用过的元素最好的硬币容器是一套,这样返回的线可以很容易地找到和移除。
关于c++ - C++中的线程池设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8266696/
我是一名优秀的程序员,十分优秀!