c++写一个线程池类,并附带例程
时间: 2024-05-04 13:16:30 浏览: 13
好的,以下是一个简单的线程池类的例程:
```
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
#include <functional>
class ThreadPool
{
public:
ThreadPool(size_t num_threads)
{
for (size_t i = 0; i < num_threads; ++i)
{
threads_.push_back(
std::thread([this]
{
while (true)
{
std::function<void()> task;
{
std::unique_lock<std::mutex> lock(mu_);
while (tasks_.empty())
{
cv_.wait(lock);
}
task = std::move(tasks_.front());
tasks_.pop();
}
task();
}
}));
}
}
~ThreadPool()
{
{
std::unique_lock<std::mutex> lock(mu_);
stop_ = true;
}
cv_.notify_all();
for (auto& thread : threads_)
{
thread.join();
}
}
template<class F, class... Args>
void enqueue(F&& f, Args&&... args)
{
{
std::unique_lock<std::mutex> lock(mu_);
tasks_.push(std::bind(std::forward<F>(f), std::forward<Args>(args)...));
}
cv_.notify_one();
}
private:
std::vector<std::thread> threads_;
std::queue<std::function<void()>> tasks_;
std::mutex mu_;
std::condition_variable cv_;
bool stop_ = false;
};
void print_num(int num)
{
std::cout << "num: " << num << std::endl;
}
int main()
{
ThreadPool pool(4);
for (int i = 0; i < 16; ++i)
{
pool.enqueue(print_num, i);
}
return 0;
}
```
这个例程中的ThreadPool类包含了一个std::vector<std::thread>用于存储工作线程的线程对象,一个std::queue<std::function<void()>>用于存储需要执行的任务(用std::function<void()>包装),一个std::mutex用于保护tasks_的读写,一个std::condition_variable用于线程间通信。
在ThreadPool的构造函数中,会创建num_threads个子线程,每个子线程会不断从tasks_中获取并执行任务直到线程池被销毁。enqueue方法用于向任务队列中添加任务,它会创建一个std::function<void()>对象,将传入的函数对象和参数绑定起来,然后加入到tasks_队列中,并通知一个等待中的线程去执行任务。
在主函数中,我们创建了一个ThreadPool对象,然后向其添加16个任务,每个任务都会调用print_num函数并将一个不同的整数作为参数传入。由于线程池中有4个工作线程,因此任务会被分配到不同的线程中执行。