socket 编程可以说是一个基本的技术掌握,而多个客户端向服务端发送请求又是一个非常常见的场景,因此多线程模式下的socket编程则显得尤为常见与重要。
本文主要利用线程池的技术,来实现多线程的模式,线程池的优点就不多述了,相信大家都能理解,就是减少了线程创建于销毁的时间,提高多线程的性能。
首先,先写个线程池: 下面分别是头文件 和cpp文件
#ifndef __THREAD_H
#define __THREAD_H
/*********************
** Filename: Thread.h
** Dsricbe: 线程池头文件
** Date: 2018.7.18
** @author: xionglei
***/
#include <deque>
#include <string>
#include <pthread.h>
using namespace std;
/**
* 执行任务的类,设置accept()描述符并执行
*/
class CTask {
protected:
string m_strTaskName; //任务的名称
int connfd; //接收的地址
public:
CTask() = default;
CTask(string &taskName): m_strTaskName(taskName), connfd(NULL) {}
virtual int Run() = 0;
void SetConnFd(int data); //设置接收的套接字连接号。
int GetConnFd();
virtual ~CTask() {}
};
/**
* 线程池类的实现
*/
class CThreadPool
{
private:
static deque<CTask*> m_deqTaskList; /** 任务队列 */
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 = 10);
int AddTask(CTask *task); /** 把任务添加到任务队列中 */
int StopAll(); /** 使线程池中的线程退出 */
int getTaskSize(); /** 获取当前任务队列中的任务数 */
};
#endif
Thread.cpp
/******************
** Fliename: Thread.cpp
** Dscribe: 线程池实现文件
** Date: 2018.7.18
** @author: xionglei
***/
#i