我设计的一个线程池

线程池的设计

目前线程池主要包含下列部分:

1.        busy_list

当前在处理客户请求的线程队列,即正在进行智能网页分析的线程

2.        idle_list

当前线程池中空闲的线程队列

3.        request_list

当用户请求到达后,发现线程池中已经没有可用线程,同时线程的个数已经达到了最大限制数(可设定的),此时只能将此次请求放入请求队列中,等待管理线程申请到可用线程后,再运行该任务

4.        manage_thread

管理线程主要负责每隔一秒后检查是否请求队列中有数据,如果有,检查当前是否有可用线程,如果有,则唤醒该空闲线程进入工作状态。

同时如果每隔十秒钟经检查请求队列中没有数据后,则检查空闲的线程队列是否需要裁剪

 

线程池的自动增长和裁剪规则:

1.        成倍增长线程个数

当用户分派任务到达时,如果发现当前并没有可空闲的线程可以使用,则检测是否可以再创建当前线程总数个数的线程,如果可以,即创建后的线程个数是当前线程个数的两倍

 

2.        单步增长

当用户分派任务到达时,如果发现当前并没有可空闲的线程可以使用,而经检测不可以进行成倍增长,但是此时线程总数还没有达到最大值,则只创建一个线程供当前任务使用

 

3.        线程裁剪

当管理线程发现此次扫描中请求队列中没有数据(每隔十秒钟进行扫描),并且空闲的线程数已超过当前线程的一半,同时满足裁剪后的线程总数不低于线程池的最少线程数,则裁剪掉当前线程池线程总数的1/4

例如: 当前线程池的线程个数为10 最低线程个数为 2 ,假设线程池一直处于空闲状态,线程的裁剪将按如下方式工作

10     2 (初始状态)à  8  2  à 6  2 à  5  2 à  4  2 à 3  2

        最终线程池中有3个线程空闲

 

线程池是一种常见的并发编程模型,它可以减少线程的创建和销毁带来的开销,提高多线程程序的性能和稳定性。下面是一个简单的C++线程池实现,仅供参考: ```c++ #include <iostream> #include <vector> #include <queue> #include <thread> #include <mutex> #include <condition_variable> #include <functional> #include <future> class ThreadPool { public: ThreadPool(size_t thread_count) : stop(false) { for (size_t i = 0; i < thread_count; ++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; }; ``` 上面的代码中,`ThreadPool`类封装了一个线程池,提供了`enqueue()`方法用于向线程池中添加任务。当调用`enqueue()`方法时,线程池会将任务封装成一个`std::packaged_task`对象,并将其放入任务队列中。工作线程会从任务队列中取出任务并执行,直到线程池被销毁或者调用`stop()`方法停止线程池。 可以使用下面的代码测试线程池的功能: ```c++ #include <chrono> #include <random> int main() { ThreadPool pool(4); std::vector<std::future<int>> results; std::random_device rd; std::mt19937 gen(rd()); std::uniform_int_distribution<> dis(1, 100); for (int i = 0; i < 8; ++i) { results.emplace_back( pool.enqueue([i, dis, &gen] { std::cout << "task " << i << " start" << std::endl; std::this_thread::sleep_for(std::chrono::seconds(dis(gen))); std::cout << "task " << i << " end" << std::endl; return i * i; }) ); } for (auto&& result : results) std::cout << result.get() << ' '; std::cout << std::endl; return 0; } ``` 上面的代码创建了一个包含4个线程的线程池,并向线程池中添加了8个任务。每个任务会随机休眠1~100秒的时间,然后返回任务编号的平方。最后打印所有任务的返回值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值