c++11实现一个线程池,多任务的分配与调度

什么是线程池?

线程池是一种线程使用模式.线程过多或者频繁的创建和销毁线程会带来调度开销,进而影响缓存局部性和整体性能.而线程池维护着多个线程,等待着管理器分配可并发执行的任务,这避免了在处理短时间任务时创建与销毁线程的代价,以及保证了线程的可复用性.线程迟不仅能保证内核的充分利用,还能防止过分调度.

线程池原理

预先创建预定数量的线程,将多个任务加入到任务队列,类似于生产者消费者,多个线程相当于消费者,一个任务队列充当生产者.当任务队列被塞入任务时,线程们就去竞争这些任务,但当每次只有一个线程能够得到任务,该任务执行完成后,线程可以释放出来去承接下一个任务,这样可以保证多个任务并发地执行.

#include <thread>
#include <mutex>
#include <atomic>
#include <condition_variable>
#include <functional>
#include <vector>
#include <queue>
#include <iostream>

class ThreadPool
{
public:
    using Task = std::function<void()>;    

    explicit ThreadPool(int num) : _thread_num(num),_is_running(false) {}

    ~ThreadPool() {
        if(_is_running)
            stop();
    }

    void start() {
        _is_running = true;

        //开启线程
        for(int i = 0; i < _thread_num; ++i)
            _threads.emplace_back(std::thread(&ThreadPool::work,
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
线程池是一种重用线程的机制,通过管理线程的生命周期、线程的数量和任务的调度实现高效的多线程处理。线程池的主要目的是减少线程创建和销毁的开销,提高线程的重用性和整体性能。 线程池实现可以采用依赖于具体语言和平台的不同方式。在C语言,我们可以通过以下步骤来实现一个简单的线程池: 1. 定义线程池的数据结构。可以使用结构体来存储线程池的属性,如线程数量、互斥锁、条件变量等。 2. 初始化线程池。在初始化过程,需要初始化线程池的属性,包括线程数量、互斥锁和条件变量,并创建指定数量的线程。 3. 定义工作任务。工作任务是线程池的每个线程需要执行的具体任务。可以定义函数指针或结构体来表示工作任务。 4. 实现线程池调度逻辑。在调度逻辑,需要设置线程池每个线程的状态,以及获取任务并分发给空闲线程进行处理。 5. 实现线程池的销毁操作。在销毁操作,需要释放线程池的资源,包括线程、互斥锁和条件变量。 通过以上步骤,我们可以实现一个简单的线程池。在实际应用,还可以对线程池进行扩展,如设置最大线程数量、超时处理、任务队列等,以更好地满足实际需求。 线程池的优点是可以提高多线程程序的性能和效率,避免了线程创建和销毁的开销,提高了线程的重用性。同时,线程池还可以进行任务调度和管理,使得多线程的编程更加方便和可控。它可以适用于需要处理大量耗时任务的应用场景,如服务器程序和并行计算等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值