动手实现C++线程池

10 篇文章 0 订阅

简易线程池用于优化高并发计算,ipp加速,多级流水线并发运算
避免频繁的创建线程且保持线程数量与核心数量一致使其更快加速计算

#include <list>
#include <vector>
#include <memory>
#include <thread>
#include <mutex>
#include <atomic>
#include <functional>
#include <condition_variable>


namespace utils {

	class ThreadPool
	{
	protected:
		std::list<std::function<void()>> m_tasks;
		std::vector<std::unique_ptr<std::thread>> m_threads;
		std::condition_variable m_condition;
		std::mutex m_mtx;
		std::condition_variable m_doneCondition;
		std::mutex m_doneMtx;
		bool m_stop;
		size_t m_maxTasks;
		size_t m_leftTasks;

	public:
		ThreadPool(int threadCount, size_t maxTask = 0)
		{
			m_maxTasks = maxTask;
			m_leftTasks = 0;
			m_stop = false;

			for (int i = 0; i < threadCount; ++i) {
				m_threads.emplace_back(new std::thread([&]() {
					std::function<void()> task;
					while (true) {
						{
							std::unique_lock<std::mutex> lock(m_mtx);
                            if (m_stop)
                                break;
							if (m_tasks.empty())
								m_condition.wait(lock);
							if (m_tasks.empty())
								continue;
							task = m_tasks.front();
							m_tasks.pop_front();
						}
						task();
						{
							std::unique_lock<std::mutex> doneLock(m_doneMtx);
							m_leftTasks -= 1;
							m_doneCondition.notify_all();
						}
					}
                }));
			}
		}

		~ThreadPool()
        {
            {
                std::unique_lock<std::mutex> lock(m_mtx);
                m_stop = true;
                m_condition.notify_all();
            }
			for (auto& thread : m_threads) {
				if (thread->joinable())
					thread->join();
			}
		}

		void schedule(const std::function<void()>& func)
		{
			{
				std::unique_lock<std::mutex> doneLock(m_doneMtx);
				if (m_maxTasks > 0 && m_leftTasks >= m_maxTasks)
					m_doneCondition.wait(doneLock);
                m_leftTasks += 1;
			}


			std::unique_lock<std::mutex> lock(m_mtx);
			m_tasks.emplace_back(func);
			m_condition.notify_one();
		}

		void wait()
		{
			while (true) {
				std::unique_lock<std::mutex> doneLock(m_doneMtx);
				if (m_leftTasks == 0)
					return;
				m_doneCondition.wait(doneLock);
				if (m_leftTasks == 0)
					return;
			}
		}

	};

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值