用C++写一个线程池代码
时间: 2023-07-01 22:12:50 浏览: 93
好的,下面是一个简单的C++线程池实现。该线程池使用队列来管理任务,并使用std::thread库和std::condition_variable库来实现多线程。
```c++
#include <iostream>
#include <thread>
#include <mutex>
#include <queue>
#include <condition_variable>
class ThreadPool {
public:
ThreadPool(size_t num_threads) : stop(false) {
for (size_t i = 0; i < num_threads; ++i) {
threads.emplace_back([this] {
while (true) {
std::function<void()> task;
{
std::unique_lock<std::mutex> lock(this->queue_mutex);
this->condition.wait(lock, [this] {
return this->stop || !this->tasks.empty();
});
if (this->stop && this->tasks.empty()) {
return;
}
task = std::move(this->tasks.front());
this->tasks.pop();
}
task();
}
});
}
}
template<typename F, typename... Args>
void enqueue(F&& f, Args&&... args) {
{
std::unique_lock<std::mutex> lock(queue_mutex);
tasks.emplace([=] {
std::invoke(std::forward<F>(f), std::forward<Args>(args)...);
});
}
condition.notify_one();
}
~ThreadPool() {
{
std::unique_lock<std::mutex> lock(queue_mutex);
stop = true;
}
condition.notify_all();
for (std::thread& thread : threads) {
thread.join();
}
}
private:
std::vector<std::thread> threads;
std::queue<std::function<void()>> tasks;
std::mutex queue_mutex;
std::condition_variable condition;
bool stop;
};
```
在这个实现中,构造函数接受一个整数参数,该参数指定线程池将使用的线程数。enqueue()函数接受一个函数和任意数量的参数,并将其打包为一个std::function对象,然后将其添加到任务队列中以等待被执行。线程池中的每个线程都执行一个循环,等待任务队列中有任务可用时执行它们,直到stop标志为true时退出循环。
当线程池的析构函数被调用时,stop标志将设置为true,并通知所有等待线程停止。每个线程将退出其循环,并等待主线程调用join()以等待所有线程退出。
这是一个简单的线程池实现,可以帮助您更好地理解如何使用多线程编程。当然,实际应用中,您可能需要考虑更多的因素,例如线程安全、任务优先级和异常处理等。
阅读全文