Nine:Adv 线程管理

    科技2024-06-02  80

    文章目录

    9.1线程池9.1.1最简单的线程池

    线程池处理线程池任务间的依赖池中线程的工作窃取中断线程

    之前章节通过为每个线程创建std::thread对象来 管理线程 一些场合,这不是你所需的 你须管理线程对象的生命周期决定适合问题和硬件的线程数量等 理想的方案 你只需将代码划分可以被并发执行的若干小片将他们传递给编译器和运行库告诉编译器“井行化这些代码来得到较优性能

    另一场景 你可能用几个线程来求解一间题,但要求它们在满足一定条件的时候提前结束 结果已经被求解出来,或因有错甚至是因为用户显式要求操作被放弃不管什么原因,线程需被发送“请停止”信号 它们可以放弃赋予它们的任务清理自己的环境,然后停止

    本章从自动管理线程数量和线程之间的任务划分 开始介绍管理线程和任务的机制

    9.1线程池

    公司提供汽车池 有一定数量汽车供员工出差用 员工要出差时 在合适时间向汽车池申请一辆汽车出差回来的时候,员工将汽车归还给汽车池如果汽车池中没有可用的汽车,员工需要重新规划自己出差的行程

    线程池类似 不过其中共享的是线程而不是汽车。 大多数系统上面, 为每个可以与其他任务并行执行的任务分配一个单独的线程是不切实际 但可尽量充分利用硬件提供的并发性线程池允许你利用这一点可被并发执行的任务被提交到线程池,在线程池中被放入一个等待队列每个任务会被某个工作线程从等待中取出来执行工作线程的任务就是当空闲的时候从等待队中取出任务来执行

    建立一个线程池有几个关键设计问题 比如在线程池中创建几个工作线程将任务高效分配给工作线程的方法以及是否可以等待某个任务的完成等。 这节 提出一些实现来解决这些问题我们从最简单的线程池开始

    9.1.1最简单的线程池

    含一个固定数量的工作线程 (典型std::thread::hardware_concurrency()) 当有任务要处理时 调一个函数将任务放到等待队列 每个工作线程都是从该队列中取出任务 执行完任务之后继续从等待队列取出更多的任务来处理。最简单的情况,没有办法来等待一个任务完成。如果需要有这样的功能,则需要用户自己维护同步 用一个向量来保存工作线程②,用第6章中线程安全的队列1来管理待处理的任务。这个实现中,用户不能等待任务,也不能返回任何值。所以你可用std::function<voia()>来封装你的任务。ubmi t()将任何函数或者能够调用的对象包装成为std:: function<void()>实例,然后放到队列
    Processed: 0.011, SQL: 8