线程池的核心实现
来源:互联网 发布:马士兵java基础教程 编辑:程序博客网 时间:2024/06/02 00:58
一句话总结:用队列实现,生产者添加任务,消费者执行任务;注意原子性操作。
#include <iostream>#include <boost/bind.hpp>#include <boost/function.hpp>#include <pthread.h>#include <queue>using namespace std;#define THREAD_NUM 3#define QUEUE_SIZE 3typedef boost::function<void ()> Task;queue<Task> queueTask;pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER;pthread_cond_t g_cond = PTHREAD_COND_INITIALIZER;Task take(){pthread_mutex_lock(&g_mutex);if(queueTask.empty())cout <<"queue task is empty" <<endl;while (queueTask.empty()){pthread_cond_wait(&g_cond, &g_mutex);}Task task;if(!queueTask.empty())cout <<"queue task is not empty" <<endl;if (!queueTask.empty()){task = queueTask.front();queueTask.pop();pthread_cond_signal(&g_cond);}pthread_mutex_unlock(&g_mutex);return task;}void add(Task& task){pthread_mutex_lock(&g_mutex);if(queueTask.size() >= QUEUE_SIZE)cout <<"queue task is full" <<endl;while(queueTask.size() >= QUEUE_SIZE){pthread_cond_wait(&g_cond, &g_mutex);}queueTask.push(task);pthread_cond_signal(&g_cond);pthread_mutex_unlock(&g_mutex);return;}void* func(void* arg){while (1){Task task(take());if (task){cout << "run task........."<<endl;task();}}}void print(){cout<<"execute thread pool task............" <<endl;}int main(){cout<<"test thread pool, pool size is 3" <<endl;pthread_t thread[THREAD_NUM];for (int i = 0; i < THREAD_NUM; ++i){int ret = pthread_create(&thread[i], NULL, func, NULL);if (ret != 0){return 1;}}boost::function<void()> fp = boost::bind(print);int cnt = 0;cout <<"add 5 tasks " <<endl;while(cnt < 5){add(fp);++cnt;}sleep(3);cout <<"=================add another task==============="<<endl;sleep(3);add(fp);for(int i=0; i<THREAD_NUM; ++i){pthread_join(thread[i], NULL);}add(fp);return 0;}
阅读全文
0 0
- 线程池的核心实现
- JDK并发包中的线程池(二)核心线程池的内部实现
- jdk线程池的核心代码
- 线程的核心流程
- 12.线程的引出与实现——核心级线程实现实例
- Java核心内库-线程-通过实现Runnable接口的方式创建并启动线程
- 优雅设计封装基于Okhttp3的网络框架(三):多线程下载功能核心实现 及 线程池、队列机制、终止线程解析
- Windows核心编程<读书笔记十一>线程池的使用
- Windows核心编程 第十一章 线程池的使用
- 深入理解Java的线程池概念及核心方法
- 线程池的实现
- 线程池的实现
- 线程池的实现
- 线程池的实现
- 线程池的实现
- 线程池的实现
- 线程池的实现
- windows核心编程--线程池
- BZOJ1087 [SCOI2005]互不侵犯King 状压DP
- log4j日志桥接到logback
- HDOJ2099 整除的尾数
- 如何在 ImageNet 比赛中获得冠军?
- PHP的八种数据类型
- 线程池的核心实现
- 关于android studio配置问题与android sdk
- 基于Mac os 10.12.6,openCV3.3+opencv_contrib配置,使用cmake
- [LintCode 32] Minimum Window Substring(Python)
- HDU1281 棋盘游戏(匈牙利算法,暴力)
- HTML2游戏——绿林怪盗
- 【软件开发模式】对比(瀑布、迭代、螺旋、敏捷)
- 大数相加*加强版*
- JSF-PrimeFaces实现图片的上传、下载、删除、预览