为了实现修改线程池中线程的个数和使每个线程都能独立控制是否退出,您需要对代码进行一些修改。下面是一个可能的解决方案:
void OBSThreadPool::modify(size_t newNum)
{
std::unique_lock<std::mutex> lock(_mutex);
if (newNum == _threadNum) {
return; // 如果新旧线程数量相同,则直接返回
}
if (newNum < _threadNum) {
size_t diff = _threadNum - newNum;
for (size_t i = 0; i < diff; ++i) {
_tasks.push_back(nullptr); // 添加空任务以退出多余线程
_condition.notify_one(); // 通知等待的线程处理退出信号
}
} else {
size_t diff = newNum - _threadNum;
for (size_t i = 0; i < diff; ++i) {
_threads.push_back(new thread(&OBSThreadPool::run, this));
}
}
_threadNum = newNum;
}
void OBSThreadPool::stop()
{
std::unique_lock<std::mutex> lock(_mutex);
for(auto& thread : _threads)
{
if(thread->joinable())
{
thread->join();
}
delete thread;
}
_threads.clear();
_bTerminate = true;
}
bool OBSThreadPool::isTerminate(size_t index)
{
std::unique_lock<std::mutex> lock(_terminateMutex);
if(index >= 0 && index <_threads.size()){
return terminateFlags[index];
}
return false;
}
void OBSThreadPool::setTerminate(size_t index, bool value)
{
std::unique_lock<std::mutex> lock(_terminateMutex);
if(index >= 0 && index <_threads.size()){
terminateFlags[index] = value;
}
}
在上述代码中,我们增加了 modify
方法来动态修改线程池中的线程数量,并且添加了 _terminateFlags
数组来记录每个线程的退出状态。同时,修改了 stop
方法以确保所有子线程安全退出,并设置 _bTerminate
标志为 true
。
请根据具体需求和代码架构进行适当的调整和完善。
内容由零声教学AI助手提供,问题来源于学员提问