怎么创建线程池c/c++
时间: 2023-12-14 12:38:11 浏览: 30
创建线程池的一般步骤如下:
1. 定义一个任务队列,用于存储需要执行的任务;
2. 创建一组线程,线程数需要根据实际情况进行调整;
3. 在每个线程中循环执行以下操作:
a. 从任务队列中取出一个任务;
b. 执行任务;
c. 如果任务队列为空,则等待新任务的到来。
下面给出一个简单的 C++ 线程池的实现代码:
```c++
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
#include <functional>
using Task = std::function<void()>;
class ThreadPool
{
public:
ThreadPool(int threadCount)
{
for (int i = 0; i < threadCount; ++i)
{
threads_.emplace_back(std::thread([this] {
while (true)
{
Task task;
{
std::unique_lock<std::mutex> lock(mutex_);
condition_.wait(lock, [this] {
return !tasks_.empty() || stop_;
});
if (stop_ && tasks_.empty()) return;
task = std::move(tasks_.front());
tasks_.pop();
}
task();
}
}));
}
}
~ThreadPool()
{
{
std::unique_lock<std::mutex> lock(mutex_);
stop_ = true;
}
condition_.notify_all();
for (auto& thread : threads_)
{
thread.join();
}
}
template<class F, class... Args>
auto enqueue(F&& f, Args&&... args) -> std::future<typename std::result_of<F(Args...)>::type>
{
using ReturnType = typename std::result_of<F(Args...)>::type;
auto task = std::make_shared<std::packaged_task<ReturnType()>>(std::bind(std::forward<F>(f), std::forward<Args>(args)...));
std::future<ReturnType> result = task->get_future();
{
std::unique_lock<std::mutex> lock(mutex_);
if (stop_)
{
throw std::runtime_error("enqueue on stopped ThreadPool");
}
tasks_.emplace([task]() { (*task)(); });
}
condition_.notify_one();
return result;
}
private:
std::vector<std::thread> threads_;
std::queue<Task> tasks_;
std::mutex mutex_;
std::condition_variable condition_;
bool stop_ = false;
};
```
使用方法如下:
```c++
#include <iostream>
#include <chrono>
void print(const std::string& str, int n)
{
for (int i = 0; i < n; ++i)
{
std::cout << str << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
}
int main()
{
ThreadPool pool(4);
auto f1 = pool.enqueue(print, "hello", 5);
auto f2 = pool.enqueue(print, "world", 5);
f1.get();
f2.get();
return 0;
}
```