c++ 多线程线程池
时间: 2024-12-30 20:10:33 浏览: 9
### C++ 中实现多线程和线程池的方法
#### 使用 `std::thread` 创建单个线程
在 C++ 中,可以利用标准库 `<thread>` 提供的功能来启动新的线程。通过实例化 `std::thread` 对象并传递给它要在线程内运行的目标函数或可调用对象。
```cpp
#include <iostream>
#include <thread>
void threadFunction(int id) {
std::cout << "Thread ID, " << id << ", is running.\n";
}
int main() {
std::thread t(threadFunction, 1);
// 主线程等待子线程结束
if (t.joinable()) {
t.join();
}
}
```
这段代码展示了如何定义一个简单的线程函数,并将其作为参数传入到新创建的线程中去执行[^1]。
#### 构建基本线程池结构
为了更高效地管理和复用工作线程,在实际应用中通常会构建线程池模式。这里给出一种基于任务队列的工作窃取型线程池的设计思路:
- **任务封装**:将待处理的任务打包成共享指针形式存储于阻塞队列里;
- **工作者线程**:预先分配一定数量的固定线程持续监听任务列表的变化情况;
- **提交接口**:对外提供便捷方法用于向内部添加新作业;
下面是简化版的具体实现方式[^4]:
```cpp
#include <queue>
#include <vector>
#include <memory>
#include <future>
#include <functional>
#include <exception>
#include <stdexcept>
#include <mutex>
#include <condition_variable>
#include <thread>
class ThreadPool {
public:
explicit ThreadPool(size_t threads): stop(false){
for(size_t i = 0;i<threads;++i)
workers.emplace_back(
[this]
{
for(;;){
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<class F, class... Args>
auto enqueue(F&& f, Args&&... args)
-> std::future<typename std::result_of<F(Args...)>::type>{
using return_type = typename std::result_of<F(Args...)>::type;
auto task = std::make_shared< std::packaged_task<return_type()> >(
std::bind(std::forward<F>(f), std::forward<Args>(args)...)
);
std::future<return_type> res = task->get_future();
{
std::unique_lock<std::mutex> lock(queue_mutex);
// 不允许再加入任务的情况
if(stop)
throw std::runtime_error("enqueue on stopped ThreadPool");
tasks.emplace([task](){ (*task)(); });
}
condition.notify_one();
return res;
}
~ThreadPool(){
{
std::unique_lock<std::mutex> lock(queue_mutex);
stop=true;
}
condition.notify_all();
for(std::thread &worker:workers)
worker.join();
}
private:
std::vector<std::thread> workers;
std::queue<std::function<void()>> tasks;
std::mutex queue_mutex;
std::condition_variable condition;
bool stop;
};
```
此段程序实现了具有动态负载均衡特性的轻量级线程池框架,能够有效减少频繁创建销毁线程所带来的开销问题[^2]。
阅读全文