c++线程池代码
线程池是一种常用的多线程编程技术,在高并发的场景下可以提高程序运行效率。下面是一个简单的C++线程池实现代码示例。
首先需要定义一个任务类,表示线程池要执行的任务。任务类中可以包含一个函数指针,用于执行具体的任务。
```c++
class Task {
public:
Task(void (*func)(void*), void* arg) : m_func(func), m_arg(arg) {}
void execute() { m_func(m_arg); }
thread技术 private:
void (*m_func)(void*);
void* m_arg;
};
```
接下来定义线程池类,其中包含一个任务队列和一组工作线程。
```c++
class ThreadPool {
public:
ThreadPool(int thread_count) : m_stop(false) {
for (int i = 0; i < thread_count; ++i) {
place_back([this] {
while (!m_stop) {
std::unique_lock<std::mutex> lock(m_mutex);
m_condition.wait(lock, [this] { return m_stop || !pty(); });
if (m_stop && pty()) return;
auto task = std::move(m_tasks.front());
m_tasks.pop();
lock.unlock();
ute();
}
});
}
}
~ThreadPool() {
{
std::unique_lock<std::mutex> lock(m_mutex);
m_stop = true;
}
ify_all();
for (auto& thread : m_threads) {
thread.join();
}
}
template <typename F, Args>
void addTask(F&& f, Args&&... args) {
auto task = std::make_shared<Task>(std::bind(std::forward<F>(f), std::forward<Args>(args)...));
std::unique_lock<std::mutex> lock(m_mutex);
place([task] { task->execute(); });
lock.unlock();
ify_one();
}
private:
std::vector<std::thread> m_threads;
std::queue<std::function<void()>> m_tasks;
std::mutex m_mutex;
std::condition_variable m_condition;
bool m_stop;
};
```
在上面的代码中,线程池的构造函数会初始化一组指定数量的工作线程,并启动它们,每个线程会不断地从任务队列中获取任务并执行,直到线程池被销毁。
线程池的析构函数会先将m_stop标志设置为true,然后通知所有线程退出,最后等待所有线程执行完毕。
线程池提供了一个addTask方法,用于向任务队列中添加新的任务。这个方法使用了可变
参数模板和std::bind函数,可以将任意类型的函数和参数绑定为一个任务对象,然后添加到任务队列中。
这个线程池实现比较简单,可以满足基本的需求,但还有一些不足之处,比如没有考虑线程池中线程的数量动态调整、任务队列的容量限制等问题,需要根据实际情况进行改进。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论