能帮我写一个基于CPP11和懒汉模式下的单例线程池吗
时间: 2023-05-28 15:05:32 浏览: 45
可以的,以下是基于CPP11和懒汉模式下的单例线程池的实现:
```cpp
#include <iostream>
#include <thread>
#include <queue>
#include <mutex>
#include <condition_variable>
class ThreadPool {
public:
static ThreadPool& getInstance() {
static ThreadPool instance;
return instance;
}
void submit(std::function<void()> task) {
{
std::unique_lock<std::mutex> lock(m_mutex);
m_taskQueue.push(task);
}
m_conditionVariable.notify_one();
}
private:
ThreadPool() : m_isStop(false) {
auto threadCount = std::thread::hardware_concurrency();
if (threadCount == 0) {
threadCount = 1;
}
for (size_t i = 0; i < threadCount; ++i) {
m_threads.emplace_back(std::thread([this]() {
while (true) {
std::function<void()> task;
{
std::unique_lock<std::mutex> lock(m_mutex);
m_conditionVariable.wait(lock, [this]() {
return m_isStop || !m_taskQueue.empty();
});
if (m_isStop && m_taskQueue.empty()) {
return;
}
task = std::move(m_taskQueue.front());
m_taskQueue.pop();
}
task();
}
}));
}
}
~ThreadPool() {
{
std::unique_lock<std::mutex> lock(m_mutex);
m_isStop = true;
}
m_conditionVariable.notify_all();
for (auto& thread : m_threads) {
thread.join();
}
}
ThreadPool(const ThreadPool&) = delete;
ThreadPool& operator=(const ThreadPool&) = delete;
private:
std::vector<std::thread> m_threads;
std::queue<std::function<void()>> m_taskQueue;
std::mutex m_mutex;
std::condition_variable m_conditionVariable;
bool m_isStop;
};
int main() {
ThreadPool& pool = ThreadPool::getInstance();
pool.submit([]() { std::cout << "Hello, world!" << std::endl; });
return 0;
}
```
在上面的代码中,我们使用了懒汉模式来实现单例,即在第一次调用getInstance()方法时才会创建ThreadPool对象。
线程池的submit()方法接收一个std::function<void()>类型的任务,将任务压入任务队列中,并唤醒一个等待的线程。
线程池的构造函数启动了多个线程,并不断从任务队列中获取任务并执行,直到线程池被销毁。线程池的析构函数将m_isStop标志设置为true,并唤醒所有等待的线程,等待所有线程执行完毕后再销毁线程。
在主函数中,我们通过ThreadPool::getInstance()方法获取单例对象,并向线程池提交一个任务。