使用c++实现简易线程池

线程池其实就是一堆处理任务的线程和 一个任务队列 ,处理线程不断地从这个任务队列中拿出任务进行处理。
不过需要注意的是 对于这个任务队列需要保证线程安全

一个简易的线程池需要
1,一个向任务队列中添加任务的接口
2,一个从任务队列中取出任务的接口
3,一个处理任务的方法;
4,提前创建一批线程
线程安全的任务队列使用信号量和互斥锁来实现

1.创建线程
void start(int threadCount);
循环创建 threadcount 个线程
绑定处理任务的方法
在这里插入图片描述

2.添加任务的接口
向任务队列中添加任务 ,添加完成之后唤醒一个线程
在这里插入图片描述
3.从队列中取出任务
判断当队列中元素个数为0的时候使用wait方法,阻塞线程

如果元素个数不为0,获取一个任务,将这个任务移除队列,线程处理任务。
在这里插入图片描述

完整代码

#ifndef MYTHREADPOOL_H
#define MYTHREADPOOL_H

#include<functional>
#include<vector>
#include<thread>
#include<queue>
#include<condition_variable>
#include<mutex>
#include<iostream>
using namespace std;
class MyThreadPool {
public:
	//定义一个void类型的函数类型
	typedef std::function<void()> Task;

	~MyThreadPool();
	static MyThreadPool* GetInstance();

	//启动线程池,线程池进入等待状态
	void start(int thread_count);

	//关闭线程池,如果没有任务了就直接推出所有线程,如果有则等待完成后全部推出
	void stop();

	//添加一个任务
	void addTask(const Task& ta);

private:
	MyThreadPool();
	void runTask();
	Task takeTask();

	vector<thread>m_threads;//线程
	queue<Task>m_taskqueue;//任务队列
	condition_variable m_cond;//条件变量
	mutex m_mutex;//互斥锁
	mutex m_con_mutex;
	int m_thread_count;//线程数
	int max_task;
	bool over;//是否退出
};

#include"MyThreadPool.h"
#include<Windows.h>

MyThreadPool::MyThreadPool() {
	over = false;
}

MyThreadPool::~MyThreadPool() {

}

MyThreadPool* MyThreadPool::GetInstance()
{
	static MyThreadPool instance;
	return &instance;
}
void MyThreadPool::start(int threadCount) {
	m_thread_count = threadCount;
	over = false;
	for (int i = 0; i < m_thread_count; ++i) {
		m_threads.push_back(thread(&MyThreadPool::runTask, this));
		m_threads[i].detach();
	}
}

void MyThreadPool::stop(){
	unique_lock<mutex> lck(m_mutex);
	over = true;
	m_cond.notify_all();

	for (int i = 0; i < m_thread_count; ++i)
	{
		m_threads[i].detach();
	}

	m_threads.clear();
}

void MyThreadPool::addTask(const Task& task) {
	unique_lock<mutex> lck(m_mutex);
	m_taskqueue.push(task);
	m_cond.notify_one();
}

void MyThreadPool::runTask() {
	unique_lock<mutex> lck(m_con_mutex);
	while (!over || !m_taskqueue.empty()) {
		Task task = takeTask();
		if (task)
		{
			std::cout << "任务队列大小:" << m_taskqueue.size() << "线程id" << this_thread::get_id() << endl;
			task();
		}
	}
}

MyThreadPool::Task MyThreadPool::takeTask() {
	unique_lock<mutex> lck(m_mutex);
	while (m_taskqueue.empty() && !over) {
		m_cond.wait(lck);
	}
	Task task;
	if (!m_taskqueue.empty()) {                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
		task = m_taskqueue.front();
		m_taskqueue.pop();
	}
	return task;
}


#include <iostream>
#include<Windows.h>
#include"MyThreadPool.h"

//线程池 就是一个阻塞队列 和一堆线程
void func(int i) {
    cout << "task finish" << "-----" << i << "线程id" << this_thread::get_id() << endl;
}
int main()
{
    std::cout << "Hello World!\n";
    MyThreadPool *pool =  MyThreadPool::GetInstance();
    pool->start(5);
    int i = 0;
    while (1)
    {
        i++;
        auto task = bind(func, i);
        pool->addTask(task);
    }

    pool->stop();
    return 0;
}

测试截图
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用C++11实现线程池的示例代码: ```cpp #include <iostream> #include <vector> #include <queue> #include <thread> #include <mutex> #include <condition_variable> #include <functional> class ThreadPool { public: ThreadPool(size_t num_threads) { for (size_t i = 0; i < num_threads; ++i) { threads_.emplace_back([this] { while (true) { std::unique_lock<std::mutex> lock(mutex_); condition_.wait(lock, [this] { return !tasks_.empty() || stop_; }); if (stop_ && tasks_.empty()) return; auto task = std::move(tasks_.front()); tasks_.pop(); lock.unlock(); task(); } }); } } ~ThreadPool() { { std::unique_lock<std::mutex> lock(mutex_); stop_ = true; } condition_.notify_all(); for (auto& thread : threads_) thread.join(); } template<class F> void Enqueue(F&& task) { { std::unique_lock<std::mutex> lock(mutex_); tasks_.emplace(std::forward<F>(task)); } condition_.notify_one(); } private: std::vector<std::thread> threads_; std::queue<std::function<void()>> tasks_; std::mutex mutex_; std::condition_variable condition_; bool stop_ = false; }; int main() { ThreadPool pool(4); for (int i = 0; i < 8; ++i) { pool.Enqueue([i] { std::cout << "Task " << i << " is running" << std::endl; std::this_thread::sleep_for(std::chrono::seconds(1)); std::cout << "Task " << i << " is done" << std::endl; }); } return 0; } ``` 此示例实现了一个线程池,其中包含一个任务队列和一组工作线程。构造函数创建指定数量的工作线程,并启动它们以侦听任务队列。Enqueue()方法用于将新任务添加到队列中。每个工作线程将从队列中获取任务并执行它。当线程池被销毁时,所有工作线程都将被停止。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值