c++ thread 线程池
时间: 2023-07-24 08:16:32 浏览: 122
C++中实现线程池的基本思路是创建一个固定大小的线程池(线程数量等于处理器数量),然后将需要执行的任务放入任务队列中,线程池中的线程从任务队列中取出任务进行执行。
以下是一个简单的C++线程池实现代码:
```c++
#include <iostream>
#include <vector>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <functional>
using namespace std;
class ThreadPool {
public:
ThreadPool(size_t num_threads) {
for (size_t i = 0; i < num_threads; ++i) {
threads.emplace_back([this]{
while (true) {
function<void()> task;
{
unique_lock<mutex> lock(m);
cv.wait(lock, [this]{
return !tasks.empty();
});
task = move(tasks.front());
tasks.pop();
}
task();
}
});
}
}
~ThreadPool() {
{
unique_lock<mutex> lock(m);
done = true;
}
cv.notify_all();
for (auto& thread : threads) {
thread.join();
}
}
template<typename F, typename... Args>
void enqueue(F&& f, Args&&... args) {
auto task = make_shared<packaged_task<void()>>(bind(forward<F>(f), forward<Args>(args)...));
{
unique_lock<mutex> lock(m);
tasks.push([task]{
(*task)();
});
}
cv.notify_one();
}
private:
vector<thread> threads;
queue<function<void()>> tasks;
mutex m;
condition_variable cv;
bool done = false;
};
```
在上面的代码中,使用了一个vector来保存线程池中的所有线程,使用一个队列来保存所有需要执行的任务。enqueue函数用于向任务队列中添加一个新任务。
每个线程都会从任务队列中取出任务进行执行,如果队列为空,则线程会一直等待直到队列中有任务。线程池中的所有线程在析构函数中会被join掉,确保所有任务都被执行完毕。
阅读全文