当一个任务交给线程池后,线程池如何知道线程执行完,然后回收那个线程,通过源码分析一下吧
时间: 2023-11-22 18:02:26 浏览: 44
线程池中的线程执行完毕后,会调用一个回调函数,该函数会将执行完毕的线程放回线程池中,以便下次任务调用。
下面是一个简单的线程池回收线程的流程:
1. 在线程池中,每个线程会被封装成一个Task对象,Task对象中有一个回调函数,表示线程执行完毕后需要执行的操作。
2. 当任务提交给线程池后,线程池会从任务队列中取出一个任务,然后将该任务封装成一个Task对象,并将该Task对象放入一个空闲线程队列中。
3. 空闲线程队列中的线程会被分配任务,执行完毕后会调用Task对象的回调函数。
4. 回调函数会将Task对象重新放入线程池中的空闲线程队列中,以便下次任务调用。
下面是一个简单的线程池回收线程的代码示例:
```
class Task {
public:
void setCallback(std::function<void()> cb) {
callback_ = std::move(cb);
}
void run() {
// 执行任务
callback_();
}
private:
std::function<void()> callback_;
};
class ThreadPool {
public:
void submit(Task task) {
// 将任务封装成Task对象并放入空闲线程队列中
Task task(std::move(task));
task.setCallback([this, task]() {
// 任务执行完毕后将Task对象重新放入空闲线程队列中
std::lock_guard<std::mutex> lock(mutex_);
idleThreads_.push_back(std::move(task));
});
std::lock_guard<std::mutex> lock(mutex_);
idleThreads_.push_back(std::move(task));
// 唤醒一个空闲线程
cv_.notify_one();
}
void workerThread() {
while (true) {
std::unique_lock<std::mutex> lock(mutex_);
// 等待任务
cv_.wait(lock, [this]() { return !idleThreads_.empty(); });
// 取出一个空闲线程
Task task = std::move(idleThreads_.front());
idleThreads_.pop_front();
lock.unlock();
// 执行任务
task.run();
}
}
private:
std::mutex mutex_;
std::condition_variable cv_;
std::deque<Task> idleThreads_;
};
```
在上述示例中,每个Task对象都有一个回调函数,当线程执行完毕后,会调用该回调函数,将Task对象重新放入空闲线程队列中。线程池中的workerThread线程会不断地从空闲线程队列中取出Task对象并执行任务。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)