c++设计线程池类启用单个线程的流程以及示例
时间: 2023-08-13 11:02:28 浏览: 115
启用单个线程的线程池类示例代码如下:
```cpp
#include <iostream>
#include <thread>
#include <queue>
#include <functional>
#include <mutex>
#include <condition_variable>
class ThreadPool {
public:
ThreadPool() : stopped(false) {}
~ThreadPool() {
stop();
}
void enqueue(std::function<void()> task) {
{
std::unique_lock<std::mutex> lock{mutex};
tasks.push(task);
}
condition.notify_one();
}
void start() {
for (int i = 0; i < 1; ++i) {
workers.emplace_back([this] {
while (true) {
std::unique_lock<std::mutex> lock{mutex};
while (!stopped && tasks.empty()) {
condition.wait(lock);
}
if (stopped && tasks.empty()) {
return;
}
auto task = tasks.front();
tasks.pop();
lock.unlock();
task();
}
});
}
}
void stop() {
{
std::unique_lock<std::mutex> lock{mutex};
stopped = true;
}
condition.notify_all();
for (auto& worker : workers) {
worker.join();
}
}
private:
std::queue<std::function<void()>> tasks;
std::vector<std::thread> workers;
std::mutex mutex;
std::condition_variable condition;
bool stopped;
};
int main() {
ThreadPool pool;
pool.start();
pool.enqueue([] {
std::cout << "Hello from task 1!" << std::endl;
});
pool.enqueue([] {
std::cout << "Hello from task 2!" << std::endl;
});
pool.stop();
return 0;
}
```
在这个示例代码中,我们创建了一个 ThreadPool 类,其中包含一个队列用于存储待执行的任务,一个线程池用于执行任务,以及一个互斥锁和条件变量用于同步任务的执行。我们还提供了 enqueue() 方法,用于将任务添加到队列中。在 start() 方法中,我们启动一个单独的线程,该线程不断地从队列中获取任务并执行它们。在 stop() 方法中,我们设置了 stopped 标志,通知所有线程停止执行任务。在主函数中,我们创建了一个 ThreadPool 实例,添加了两个任务,并在程序退出时停止线程池。
需要注意的是,这个示例代码中只启用了一个线程来执行任务。如果需要启用多个线程,只需将 for 循环中的 1 改为需要的线程数即可。
阅读全文