简介
线程池是什么?
- 打饭的阿姨们
- 前去吃饭的人们,任务
- 管理组件
线程池由三部分组成
- 执行队列,线程s
- 任务队列,任务s
- 管理组件
类似于
- 银行营业厅
- 食堂打饭
每个打饭的人都是一个线程
管理制度
参考链接
C/C++Linux后台服务器开发高级架构师免费学习链接:C/C++Linux服务器开发高级架构师/Linux后台架构师-学习视频
线程池解决什么问题
- 解决任务处理。
- 阻塞IO。
- 解决线程创建于销毁的成本问题。
- 管理线程。
- 异步解耦的作用。
问题
- 如何增加线程
- 如何减少线程
- 增加与减少的策略
C的实现策略
首先我们来认识这些多线程要用的pthread接口函数
pthread_mutex_lock(&pool->jobs_mutex); // 对资源上锁
pthread_mutex_unlock(&pool->jobs_mutex); // 对资源解锁
pthread_cond_signal(&pool->jobs_cond); // 每调用一次,相当于P操作
pthread_cond_wait(&worker->pool->jobs_cond, &worker->pool->jobs_mutex); // 每调用一次相当于V操作
简单来说条件变量就是,许可证的发放,P相当于发了一张许可证,V相当于销毁了一张许可证,当没有许可证的时候pthread_cond_wait函数阻塞
pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void (start_routine) (void *), void *arg);
attr 如果为NULL表示的是默认的属性,start_routine表示函数指针,指向默认的线程函数,arg表示线程函数的唯一的参数
pthread_exit(NULL); // 退出线程,线程销毁操作
线程池实现源代码
C/C++Linux后台服务器开发高级架构师学习视频 点击 linux服务器学习资料 获取,内容知识点包括Linux,Nginx,ZeroMQ,MySQL,Redis,线程池,MongoDB,ZK,Linux内核,CDN,P2P,epoll,Docker,TCP/IP,协程,DPDK等等。免费学习链接:C/C++Linux服务器开发高级架构师/Linux后台架构师-学习视频
code
#include <pthread.h>
#include <stdio.h>
#include<string.h>
#include <stdlib.h>
#include <unistd.h>
#include "timee.hh"
// B 站 线程池
// head insert
#define LL_ADD(item, list) do { \
item->prev = NULL; \
item->next = list; \
if(list != NULL) \
list->prev = item; \
list = item; \
} while(0)
#define LL_REMOVE(item, list) do { \
if(item->prev != NULL) item->prev->next = item->next; \
if(item->next != NULL) item->next->prev = item->prev; \
if(list =