线程池相关

线程池

线程池的执行顺序是无序的,即从任务队列中取出来任务,但是这个的执行顺序是无法保证这些线程是顺序的;
整个线程池就是基于线程的封装,并抽象两个接口,一个是任务队列,一个是工作线程队列;用到线程池的向任务队列添加任务,并调用一个接口(任务结构中定义),参数的话通过一个void指针进行传递;然后工作队列在任务队列中有任务的时候就不断提取进行程序执行;这个添加与提取的过程就涉及到了临界区,因此需要mutex来进行保护;
任务中的指针空间释放的话一般放在任务函数中,要确定好责任归属,资源是谁申请的就要由谁来进行释放;

线程池的作用

  • 减少线程创建销毁:不用在需要线程的时候动态创建,线程是一直存在的,只不过在没有任务队列的时候处于条件等待状态;
  • 异步解耦的作用:即将需要异步的执行操作通过一个接口丢在线程池中即可;

线程池接口

  • 线程池创建
  • 线程池添加任务
  • 线程池销毁

线程池的控制

  • pthread_mutex_t
    首先就是线程池针对任务队列的锁,用于保护任务队列这个临界区资源;
    pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
    pthread_mutex_lock(&mutex);
    pthread_mutex_unlock(&mutex);
    
  • pthread_cond_t
    然后就是条件变量,在线程池运行过程中,很容易遇到一种情况就是任务队列中没有任务,此时有两种方案,一种是轮询任务队列,这个就是在浪费CPU的资源;另外一种方式就是使用条件变量
    pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
    pthread_cond_wait(&cond);
    pthread_cond_signal(&cond);       -- 对等待条件变量的线程中的一个进行唤醒
    pthread_cond_broadcast(&cond);    -- 对全部等待条件变量的线程进行唤醒
    

线程ID

pthread_self返回的ID不是tid,他仅在进程范围中有效,tid需要使用syscall(SYS_gettid)来获取;tid就是LWP,主线程的LWP和pid相同,副线程的LWP和pid不相同;

抽象的粒度

计算机的核心就是模块化,不断的进行问题抽象,然后以函数的形式进行实现;

posted @   呵哈呵  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示