当前位置:   article > 正文

Linux - C++实现简单线程池_linuxc++下线程池如何调用function

linuxc++下线程池如何调用function

概念:

一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着 监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利 用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。 线程池的应用场景: 1. 需要大量的线程来完成任务,且完成任务的时间比较短。 WEB服务器完成网页请求这样的任务,使用线程池技 术是非常合适的。因为单个任务小,而任务数量巨大,你可以想象一个热门网站的点击次数。 但对于长时间的任务,比如一个 Telnet连接请求,线程池的优点就不明显了。因为Telnet会话时间比线程的创建时间大多了。 2. 对性能要求苛刻的应用,比如要求服务器迅速响应客户请求。 3. 接受突发性的大量请求,但不至于使服务器因此产生大量线程的应用。突发性大量客户请求,在没有线程池情 况下,将产生大量线程,虽然理论上大部分操作系统线程数目最大值不是问题,短时间内产生大量线程可能使内存到达极限, 出现错误。

threadPool.hpp

  1. // 线程池类定义
  2. #pragma once
  3. #include <vector>
  4. #include <queue>
  5. #include <pthread.h>
  6. #include <iostream>
  7. #include "thread.hpp"
  8. #include "mutex.hpp"
  9. #include "task.hpp"
  10. const int g_thread_num = 3;
  11. // 这样不太合适,因为这样的话,除非把它设计为单例模式,否则所有线程池共用一个任务队列,锁,条件变量,显然是不行的。
  12. // template <class T>
  13. // class ThreadPool
  14. // {
  15. // public:
  16. // // 构造函数
  17. // ThreadPool(int num = g_thread_num)
  18. // : thread_num_(num)
  19. // {
  20. // pthread_mutex_init(&mutex_, nullptr);
  21. // pthread_cond_init(&cond_, nullptr);
  22. // }
  23. // ~ThreadPool()
  24. // {
  25. // pthread_mutex_destroy(&mutex_);
  26. // pthread_cond_destroy(&cond_);
  27. // }
  28. // public:
  29. // void run()
  30. // {
  31. // pthread_t tid;
  32. // // 让所有线程执行起来,等待任务,执行任务
  33. // for (int i = 0; i < thread_num_; ++i)
  34. // {
  35. // pthread_create(&tid, nullptr, routine, (void *)this);
  36. // }
  37. // }
  38. // // 因为类成员函数,有一个隐藏的this指针,不能直接作为void* (*p)(void*)函数
  39. // //因此设置为static成员函数,但是routine内部要访问锁和条件变量,以及任务队列,因此把它们设置为static数据成员。
  40. // //但是,这样的话,所有线程池都使用一个锁,一个条件变量,一个任务队列,这无疑不是最佳方案。
  41. // static void *routine(void *args) // 消费者pop任务,此处为线程。
  42. // {
  43. // ThreadPool *tp = (ThreadPool *)args;
  44. // while (true)
  45. // {
  46. // pthread_mutex_lock(&mutex_);
  47. // while (task_queue_.empty())
  48. // pthread_cond_wait(&cond_, &mutex_); // 线程等待任务投放,并解锁
  49. // T t;
  50. // t = task_queue_.front();
  51. // task_queue_.pop();
  52. // std::cout << "线程 " <&
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号