使用C++创建一个常用的线程池

使用C++创建一个常见的线程池(可以在 C++11、C++14 或 C++17 中编译和运行。),并简要说明一下语法:
C++代码:

std::vector<std::thread> m_threads;
std::queue<std::function<void(std::shared_ptr<TDengineConnector>)>> m_tasks;
std::mutex m_queueMutex;
std::condition_variable m_condition;
bool m_stop;
std::vector<std::shared_ptr<TDengineConnector>> m_dbPrx;
m_threads.emplace_back([this, i]()
    {
        while (true)
        {
            std::function<void(std::shared_ptr<TDengineConnector>)> task;
            {
                std::unique_lock<std::mutex> lock(m_queueMutex);
                m_condition.wait(lock, [this]() { return m_stop || !m_tasks.empty(); });
                if (m_stop && m_tasks.empty())
                {
                    return;
                }
                task = std::move(m_tasks.front());
                m_tasks.pop();
            }
            // 执行任务,并将 dbProxy 作为参数传入
            if (task)
            {
                task(m_dbPrx[i]);
            }
        }
       });

分析以上代码:
作用:这段代码是用来创建一个线程池的,并且在线程池中执行任务队列中的任务。
细节语法分析:
1、emplace_back 是 std::vector 提供的一个方法,用来在容器的末尾添加一个新的元素。
2、[this, i] 是 lambda 表达式的捕获列表:
2.1 this 捕获当前对象的指针,允许线程访问类的成员变量和成员函数。
2.2 i 捕获当前循环中的线程索引。因为 lambda 需要在每个线程中独立工作,所以捕获 i 是必要的,以便在每个线程中能得到正确的数据库连接。
3、std::unique_lockstd::mutex lock(m_queueMutex);
使用 std::unique_lock 来锁定 m_queueMutex,保证访问任务队列 m_tasks 的线程安全。
std::unique_lock 相比于 std::lock_guard 提供了更多灵活性,比如能够手动解锁,适用于更复杂的场景。
4、m_condition.wait(lock, this { return m_stop || !m_tasks.empty(); });
m_condition.wait 会让当前线程进入等待状态,直到满足条件:m_stop 为 true 或者任务队列不为空。这样线程就可以在任务队列为空时进入等待,避免消耗 CPU。
m_condition 是一个 std::condition_variable,用于线程间的同步。它在任务队列为空时阻塞线程,直到有任务添加或线程池被停止。
5、if (m_stop && m_tasks.empty()) { return; }
如果 m_stop 为 true 且任务队列为空,说明线程池应该停止运行,当前线程结束执行并退出。
6、task = std::move(m_tasks.front());
从队列的前端取出一个任务(即一个函数对象),并使用 std::move 将其转移到 task 变量中。这是为了避免不必要的拷贝,因为 task 是一个可调用对象。
7、m_tasks.pop();
从任务队列中移除这个任务。

另欢迎关注公众号【比特层递】,一起学习交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值