2024年C C++ 线程池的简单封装_c++ 线程封装(1),2024年最新程序员去大公司面试

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

#include <stdlib.h>
#include <stdio.h>
#include “CTask.h”

class CThreadPool
{
public:
CThreadPool(int num);
~CThreadPool();

public: // 线程内调用
void lock_mutex(); // 上锁
void unlock_mutex(); // 解锁
void wait_for_wake(); // 线程进入睡眠,等待被唤醒
void pick_task(); // 从任务队列内拿任务并执行
int get_pid();
public:
void work(); // 生成工作线程
void add_task(CTask* &task); // 添加任务到任务队列, 并且唤醒一个线程取任务

private:
int initTotalNum; // 初始化线程总数
bool bStop; // 结束标志位

std::queue<CTask\*>task_que;					//任务队列

pthread_cond_t cond;					//线程唤醒的条件变量
pthread_mutex_t mutex;					//互斥锁

pthread_t pid;						//线程id

};


2、 类定义



#include “CThreadPool.h”
#include

using namespace std;
//void* start_routine_A(void* arg);

// 核心线程回调函数
void* start_routine_A(void* arg)
{
CThreadPool* pool = (CThreadPool*)arg; //获得本类对象

while (1)
{
	//1、 用条件变量阻塞线程(也就是让线程睡眠等待唤醒)
	pool->lock\_mutex();												//锁上cond, 保证只能cond被用的情况下不会抢占
	cout << pthread\_self() << " is waitting for task..." << endl;
	//pool->wait\_for\_wake(pool); //pthread\_cond\_wait()函数被调用,锁会自动解开,返回的时候在被锁上
	pool->wait\_for\_wake();
	cout << pthread\_self() << " is wake up for task......" << endl;
	pool->unlock\_mutex();											//公共条件遍历用完就解开锁,尽可能的缩小锁范围

	//2、 线程唤醒后从任务队列内拿任务执行
	pool->pick\_task();
	cout << "core end." << endl;
}

}

CThreadPool::CThreadPool(int num):initTotalNum(num)
{
//初始化两个锁
pthread_cond_init(&this->cond, NULL);
pthread_mutex_init(&this->mutex, NULL);
}

void CThreadPool::lock_mutex()
{
pthread_mutex_lock(&this->mutex);
}

void CThreadPool::unlock_mutex()
{
pthread_mutex_unlock(&this->mutex);
}

void CThreadPool::wait_for_wake()
{
pthread_cond_wait(&this->cond, &this->mutex);
cout << "core Thread is wake up, pid = " << this->pid << endl;
}

void CThreadPool::pick_task()
{
this->lock_mutex(); //队列也是公共资源,用之前先上锁
if (!this->task_que.empty())
{
CTask* t = this->task_que.front(); //从队列拿任务(注意:队列是先进先出,栈是先进后出)
this->task_que.pop(); //拿了就踢出队列
this->unlock_mutex(); //公共资源用完解锁

	t->run();
}
else
{
	cout << "wocao?" << endl;
	this->unlock\_mutex();								//队列为空就解锁,避免进入死锁
}

}

void CThreadPool::work()
{
// 先创建核心线程
for (int i = 0; i < this->core_num; i++)
{
pthread_create(&this->pid, NULL, start_routine_A, this);
cout << “The " << i + 1 << " core thread has been created.” << endl;

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

//bbs.csdn.net/topics/618668825)**

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值