C++ 线程池管理程序
以下是一个简单的C++线程池管理程序的示例:
#include <iostream>
#include <thread>
#include <vector>
#include <queue>
#include <mutex>
#include <condition_variable>
#include <functional>
class ThreadPool {
public:
ThreadPool(size_t numThreads) {
for (size_t i = 0; i < numThreads; i++) {
threads.emplace_back(
[this] {
while (true) {
std::function<void()> task;
{
std::unique_lock<std::mutex> lock(this->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();
}
}
);
}
}
~ThreadPool() {
{
std::unique_lock<std::mutex> lock(mutex);
stop = true;
}
condition.notify_all();
for (std::thread &worker : threads)
worker.join();
}
template<class F>
void enqueue(F&& f) {
{
std::unique_lock<std::mutex> lock(mutex);
tasks.emplace(std::forward<F>(f));
}
condition.notify_one();
}
private:
std::vector<std::thread> threads;
std::queue<std::function<void()>> tasks;
std::mutex mutex;
std::condition_variable condition;
bool stop = false;
};
int main() {
ThreadPool pool(4);
std::vector<std::future<int>> results;
for (int i = 0; i < 8; i++) {
results.emplace_back(
pool.enqueue([i] {
std::cout << "Thread " << std::this_thread::get_id() << " working on task " << i << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
std::cout << "Thread " << std::this_thread::get_id() << " finished task " << i << std::endl;
return i * i;
})
);
}
for (auto &&result : results)
std::cout << result.get() << ' ';
std::cout << std::endl;
return 0;
}
此程序创建一个线程池,可以将函数作为任务提交给线程池来执行。在这个示例中,线程池有4个线程,将8个任务提交给线程池来执行。每个任务都简单地打印一些信息并休眠1秒钟,然后返回任务编号的平方。最后,程序将等待所有任务完成,并打印每个任务的结果。
该程序使用C++11中的标准线程库和标准库容器(例如std::thread,std::vector和std::queue)。它还使用std::function和std::future,这些都是C++11中的新功能,用于支持通用函数和异步编程。
原文地址: https://www.cveoy.top/t/topic/b4Jg 著作权归作者所有。请勿转载和采集!