高并发编程之线程池实现(C++语言)

编写程序准备知识

(1)pthread_mutex_t CThreadPool::m_pthreadMutex = PTHREAD_MUTEX_INITIALIZER;(互斥锁初始化)
(2)pthread_cond_t CThreadPool::m_pthreadCond = PTHREAD_COND_INITIALIZER;(条件锁初始化)
(3) pthread_mutex_lock(&m_pthreadMutex);(加锁)
(4)pthread_mutex_unlock(&m_pthreadMutex);(解锁)
(5)pthread_cond_signal(&m_pthreadCond);(发送条件锁信号)
(6)pthread_cond_broadcast(&m_pthreadCond);(广播条件锁信号)
(7)pthread_mutex_destroy(&m_pthreadMutex);(销毁锁)
(8)pthread_cond_destroy(&m_pthreadCond);(销毁条件锁)

编写头文件

thread_pool.h文件

#ifndef __THREAD_POOL_H
#define __THREAD_POOL_H

#include <vector>
#include <string>
#include <pthread.h>

using namespace std;

/*执行任务的类:设置任务数据并执行*/
class CTask {
protected:
	string m_strTaskName;   //任务的名称
	void* m_ptrData;    //要执行的任务的具体数据

public:
	CTask() = default;
	CTask(string &taskName)
		: m_strTaskName(taskName)
		, m_ptrData(NULL) {}
	virtual int Run() = 0;
	void setData(void* data);   //设置任务数据
  
	virtual ~CTask() {}
    
};

/*线程池管理类*/
class CThreadPool {
private:
	static vector<CTask*> m_vecTaskList;    //任务列表
	static bool shutdown;   //线程退出标志
	int m_iThreadNum;   //线程池中启动的线程数
	pthread_t *pthread_id;
  
	static pthread_mutex_t m_pthreadMutex;  //线程同步锁
	static pthread_cond_t m_pthreadCond;    //线程同步条件变量
  
protected:
	static void* ThreadFunc(void *threadData);  //新线程的线程回调函数
	static int MoveToIdle(pthread_t tid);   //线程执行结束后,把自己放入空闲线程中
	static int MoveToBusy(pthread_t tid);   //移入到忙碌线程中去
	int Create();   //创建线程池中的线程
  
public:
	CThreadPool(int threadNum);
	int AddTask(CTask *task);   //把任务添加到任务队列中
	int StopAll();  //使线程池中的所有线程退出
	int getTaskSize();  //获取当前任务队列中的任务数
};

#endif

编写cpp文件

thread_pool.cpp文件

#include "thread_pool.h"
#include <cstdio>

void CTask::setData(void* data) {
	m_ptrData = data;
}

//静态成员初始化
vector<CTask*> CThreadPool::m_vecTaskList;
bool CThreadPool::shutdown = false;
pthread_mutex_t CThreadPool::m_pthreadMutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t CThreadPool::m_pthreadCond = PTHREAD_COND_INITIALIZER;

//线程管理类构造函数
CThreadPool::CThreadPool(int threadNum) {
	this->m_iThreadNum = threadNum;
	printf("I will create %d threads.\n", threadNum);
	Create();
}

//线程回调函数
void* CThreadPool::ThreadFunc(void* threadData) {
	pthread_t tid = pthread_self();
	while (1)
	{
		pthread_mutex_lock(&m_pthreadMutex);
		//如果队列为空,等待新任务进入任务队列
		while (m_vecTaskList.size() == 0 && !shutdown)
			pthread_cond_wait(&m_pthreadCond, &m_pthreadMutex);
        
		//关闭线程
		if (shutdown)
		{
			pthread_mutex_unlock(&m_pthreadMutex);
			printf("[tid: %lu]\texit\n", pthread_self());
			pthread_exit(NULL);
		}
        
		printf("[tid: %lu]\trun: ", tid);
		vector<CTask*>::iterator iter = m_vecTaskList.begin();
		//取出一个任务并处理之
		CTask* task = *iter;
		if (iter != m_vecTaskList.end())
		{
			task = *iter;
			m_vecTaskList.erase(iter);
		}
        
		pthread_mutex_unlock(&m_pthreadMutex);
        
		task->Run();    //执行任务
		printf("[tid: %lu]\tidle\n", tid);
        
	}
    
	return (void*)0;
}

//往任务队列里添加任务并发出线程同步信号
int CThreadPool::AddTask(CTask *task) { 
	pthread_mutex_lock(&m_pthreadMutex);    
	m_vecTaskList.push_back(task);  
	pthread_mutex_unlock(&m_pthreadMutex);  
	pthread_cond_signal(&m_pthreadCond);    
    
	return 0;
}

//创建线程
int CThreadPool::Create() { 
	pthread_id = new pthread_t[m_iThreadNum];
	for (int i = 0; i < m_iThreadNum; i++)
		pthread_create(&pthread_id[i], NULL, ThreadFunc, NULL);
        
	return 0;
}

//停止所有线程
int CThreadPool::StopAll() {    
    //避免重复调用
	if (shutdown)
		return -1;
	printf("Now I will end all threads!\n\n");
    
	//唤醒所有等待进程,线程池也要销毁了
	shutdown = true;
	pthread_cond_broadcast(&m_pthreadCond);
    
	//清楚僵尸
	for (int i = 0; i < m_iThreadNum; i++)
		pthread_join(pthread_id[i], NULL);
    
	delete[] pthread_id;
	pthread_id = NULL;
    
	//销毁互斥量和条件变量
	pthread_mutex_destroy(&m_pthreadMutex);
	pthread_cond_destroy(&m_pthreadCond);
    
	return 0;
}

//获取当前队列中的任务数
int CThreadPool::getTaskSize() {    
	return m_vecTaskList.size();
}

运行原理图

在这里插入图片描述

使用C++库实现线程池(多线程,互斥锁)

#include <iostream>       // std::cout
#include <thread>         // std::thread
#include <mutex>          // std::mutex

volatile int counter(0);     //定义一个全局变量,当作计数器用于累加
std::mutex mtx;           // 用于保护counter的互斥锁

void thrfunc() 
{
	for (int i = 0; i < 10000; ++i) 
	{
		if (mtx.try_lock())// 互斥锁上锁
		{
			++counter; //计数器累加
			mtx.unlock(); //互斥锁解锁
		}
		else std::cout << "try_lock false\n"  ;
	}
}

int main(int argc, const char* argv[]) 
{
	std::thread threads[10];
	
	for (int i = 0; i < 10; ++i)
		threads[i] = std::thread(thrfunc); //启动10个线程

	for (auto& th : threads) th.join(); //等待10个线程结束
	std::cout << "count to " << counter << " successfully \n";

	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《Java并发编程实战 第二版》是一本非常优秀的Java并发编程经典著作,由Brian Goetz等多位作者共同编写而成。这本书的内容主要讲解了Java并发编程的基础知识,详细介绍了Java内存模型、线程安全性、锁、并发集合、并行计算等基础概念,并提供了大量的实际场景中的示例代码,非常适合Java开发工程师深入学习和实践。 本书分为四个部分,分别是基础知识部分、结构部分、行为部分和高级主题部分。其中基础知识部分主要讲解了Java并发编程的基本概念和原理;结构部分介绍了并发编程中的线程安全性、锁和同步机制;行为部分详细讲解了并发编程中的线程执行顺序、避免死锁和饥饿等问题;高级主题部分则探讨了Java并发编程中的高级技术,如并发集合、线程池、并行计算等。 总之,《Java并发编程实战 第二版》是一本非常值得推荐的Java并发编程经典著作,对于想要深入学习Java并发编程的开发工程师来说是一本不可或缺的参考资料。无论是从理论知识还是实践应用层面,都是非常有价值的。 ### 回答2: 《并发编程实战》第二版pdf文件是一本关于多线编程的经典著作,书中详细介绍了多线编程的基础知识、常见问题及解决方案,非常适合想要深入了解多线编程的开发人员学习。 本书首先讲解了多线程的基础知识和概念,例如线程的创建、启动和停止等基本操作,以及多线编程中遇到的常见问题,例如死锁、竞态条件等,给读者提供了全面的多线编程基础。 随后,本书深入介绍了Java中的并发编程框架,如并发集合、锁、线程池等工具,同时也介绍了Java中的原子变量和锁优化等高级特性,让读者掌握和应用Java中的高效并发框架。 此外,本书还介绍了多线编程相关的一些设计模式,例如线程封闭、不变模式等,为读者提供了一些实践经验和参考。 总之,《并发编程实战》第二版pdf文件是一本非常实用的多线编程经典著作,通过深入浅出的方式,让读者全面掌握多线编程的基础知识和高级特性,更好地应用多线编程解决实际问题。 ### 回答3: 《并发编程实战第二版pdf》是一本非常实用的书籍,它讲述了Java并发编程的最佳实践及常用技术。书中详细介绍了Java并发程序设计中的竞态条件、死锁、线程安全性、锁的性能、并发集合、线程池等重要问题,并给出了相应的解决方案。 书中的示例代码生动具体,通过实例许多并发问题被生动地展现出来。在一个高并发的系统里,很多人写的代码是为了完成短暂高并发,而不是持续高并发。但是这类代码在面临持续高并发的时候很容易崩溃。此时,中断与关闭线程、同步、线程安全性和锁的性能等都是需要考虑的问题。书中通过生动的案例详细阐述了这些问题,让读者更加深入地理解了如何编写高效的并发程序。 此外,书中还对线程池做了深入的讲解,介绍了如何使用线程池来提高并发性能,以及如何合理配置线程池参数。更为重要的是,书中的最后一章还讨论了大规模并发系统的设计和实现。这对目前越来越需要高并发处理的各类系统开发工程师来说,是一份非常有价值的参考资料。 总之,如果你是一名Java开发工程师,那么《并发编程实战第二版pdf》是一本必读的书籍。它能够帮助你理解Java并发编程的精髓,并提供有用的技术指导,以便你写出更高效、更安全、更稳定的代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值