网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事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;
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
//bbs.csdn.net/topics/618668825)**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!