线程池
来源:互联网 发布:steam购买软件退货 编辑:程序博客网 时间:2024/05/16 18:05
实现了一个最简单的线程池,没有考虑惊群现象
#include "pthread.h"#include "semaphore.h"#include <list>#include <vector>#include <iostream>using std::list;using std::vector;struct thread_job{ void(*func)(void *); void *arg;};class thread_pool{public: thread_pool(int size_ = 10); ~thread_pool(); void add_job(void (*func)(void*), void *arg); static void * route_task(void *);//private: void destroy();private: int max_threads; // 线程池中最大线程数限制 int curr_threads; // 当前线程池中总的线程数 int idle_threads; // 当前线程池中空闲的线程数 pthread_mutex_t mutex; pthread_cond_t cond; sem_t sem; list<thread_job*> job_list; vector<pthread_t> thread_handle; bool stop_flag;};thread_pool::thread_pool(int size_){ stop_flag = false; max_threads = size_; thread_handle.resize(max_threads); curr_threads = 0; idle_threads = size_; if (pthread_cond_init(&(cond), NULL)) { perror("pthread_mutex_init: "); } if (pthread_mutex_init(&(mutex), NULL)) { perror("pthread_mutex_init: "); } for (int i = 0; i < max_threads; i++){ if (pthread_create(&(thread_handle[i]), NULL, route_task, this)) { perror("pthread_create:"); } //pthread_detach((thread_handle[i])); }}void * thread_pool::route_task(void *arg){ thread_pool * pool = static_cast<thread_pool *>(arg); pthread_mutex_lock(&(pool->mutex)); while (1) { if (pool->job_list.empty()) { pool->idle_threads++; if (pool->stop_flag){ pthread_mutex_unlock(&(pool->mutex)); break; } { pthread_cond_wait(&pool->cond, &(pool->mutex)); } if (pool->stop_flag){ pthread_mutex_unlock(&(pool->mutex)); break; } } else { pool->idle_threads--; thread_job* job = pool->job_list.front(); pool->job_list.pop_front(); pthread_mutex_unlock(&pool->mutex); job->func(job->arg); pool->idle_threads++; delete job; pthread_mutex_lock(&(pool->mutex)); } } return NULL;}void thread_pool::add_job(void (*func)(void*), void *arg){ thread_job* njob= new thread_job; njob->arg = arg; njob->func = func; pthread_mutex_lock(&mutex); if (job_list.empty()) { job_list.push_back(njob); pthread_cond_signal(&cond); } else { job_list.push_back(njob); } pthread_mutex_unlock(&mutex);}void thread_pool::destroy(){ stop_flag = true; pthread_cond_broadcast(&cond); for each (pthread_t var in thread_handle) { pthread_join(var, NULL); }}thread_pool::~thread_pool(){ destroy();}int ans = 0;void add1(void *arg){ ans++; std::cout << ans << std::endl;}int main(){ thread_pool pool(40); for (int i = 0; i < 1000; i++) { pool.add_job(add1, NULL); } return 0;}
0 0
- 线程与线程池
- 线程池 线程优先级
- Executor线程,线程池
- 线程、多线程、线程池
- IOS-线程、线程池
- Java线程:线程池
- 线程和线程池
- 线程、多线程、线程池
- 线程、多线程、线程池
- 线程(六)线程池
- ExecutorService(线程池)+线程
- 线程和线程池
- 线程&线程池 简略
- 线程和线程池
- 线程池 线程锁
- 线程、线程池总结
- 线程与线程池
- 线程、锁、线程池
- IOS 常用控件 收集
- hive学习 —分区、分桶和索引
- java synchronized详解
- Javascript 严格模式详解
- uva146 ID codes
- 线程池
- eclipse 无法加载虚拟机
- 《WINDOWSPE权威指南》学习笔记(四)- 导出表、栈、重定位表、资源等机制
- 转载自Avril的关于 main(int argc,char* argv[])问题
- Spark实践项目4:Spark基本概念
- hive学习 —hive性能调优
- Java Web Xml文档声明
- Code Monkey开发辅助工具推荐
- 解决nginx负载均衡的session共享问题