C++系列
- 第一章 C++单例模式
- 第二章 数据流对象CData
- 第三章 基于基础数据类型的封解包模板
- 第四章 FIFO单链列表
- 第五章 C++线程
- 第六章 C++线程池
- 第七章 定时器
- 第八章 消息中心
- 第九章 网络访问器
- 第十章 HttpClient
- 第十一章 FTPClient
- 第十二章 Socket客户端
- 第十三章 Socket服务端
- 第十四章 WebSocket
大部分章节不会详细讲解,基本是以源码形式展现给大家,欢迎各路大侠搬砖和点评^_^,详细源码查看Github
目录
前言
对于一个项目,原始的线程不仅写起来麻烦,处理多线程和多任务的时候操作比较繁琐不便,很难更好的完成多任务的执行。
自己就萌生了自己写线程池的想法,但是这个线程池代码在一个成熟的项目上已经用了很久了,但是跑的项目还是较少。
给大家参考参考,过多的基础知识就不在此陈述了,千篇一律,多翻翻多看看,每个人都是一步一步走出来的。
元素构成
- 基础元素:线程、信号量、函数式、线程锁
- 扩展元素:信号量类、基类线程池
信号量类
信号量类基于c语言线程锁、线程信号量和时间实现。
CCondition.hpp
//
// CCondition.hpp
// ZJCrossCpp
//
// Created by eafy on 2020/10/5.
// Copyright © 2020 ZJ. All rights reserved.
//
#ifndef CCondition_hpp
#define CCondition_hpp
#include <stdio.h>
#include <pthread.h>
#include "CDefType.hpp"
ZJ_NAMESPACE_BEGIN
class CCondition
{
public:
CCondition();
virtual ~CCondition();
int Lock(); //加锁
int TryLock();
int Unlock(); //解锁
int Wait(); //等待(内部会加锁)
int WaitTime(long msTime); //等待time毫秒(内部会进行加锁处理)
int Signal(); //唤醒一个睡眠线程
int Broadcast(); //唤醒所有睡眠线程
bool IsWaiting(); //是否在等待或休眠
private:
pthread_mutex_t m_Mutex;
pthread_cond_t m_Cond;
};
ZJ_NAMESPACE_END
#endif /* CCondition_hpp */
CCondition.cpp
//
// CCondition.cpp
// ZJCrossCpp
//
// Created by eafy on 2020/10/5.
// Copyright © 2020 ZJ. All rights reserved.
//
#include "CCondition.hpp"
#include <time.h>
#include <sys/time.h>
#include <sys/errno.h>
ZJ_NAMESPACE_BEGIN
CCondition::CCondition()
{
pthread_mutex_init(&m_Mutex, nullptr);
pthread_cond_init(&m_Cond, nullptr);
}
CCondition::~CCondition()
{
pthread_mutex_destroy(&m_Mutex);
pthread_cond_destroy(&m_Cond);
}
int CCondition::Lock()
{
return pthread_mutex_lock(&m_Mutex);
}
int CCondition::TryLock()
{
return pthread_mutex_trylock(&m_Mutex);
}
int CCondition::Unlock()
{
return pthread_mutex_unlock(&m_Mutex);
}
int CCondition::Wait()
{
Lock();
int ret = pthread_cond_wait(&m_Cond, &m_Mutex);
Unlock();
return ret;
}
int CCondition::WaitTime(long msTime)
{
if (msTime <= 0) return EAGAIN;
Lock();
int ret = 0;
#if defined(__APPLE__) //iOS
if (__builtin_available(iOS 10.0, *)) {
struct timespec abstime;
clock_gettime(CLOCK_REALTIME, &abstime);
if (msTime >= 1000) {
abstime.tv_sec += msTime / 1000;
abstime.tv_nsec += msTime % 1000 * 1000000;
} else {
abstime.tv_nsec += msTime * 1000000;
}
ret = pthread_cond_timedwait(&m_Cond, &m_Mutex, &abstime);
} else {
struct timeval valtime;
gettimeofday(&valtime, NULL);
if (msTime >= 1000) {
valtime.tv_sec += msTime / 1000;
valtime.tv_usec += msTime % 1000 * 1000;
} else {
valtime.tv_usec += msTime * 1000;
}
struct timespec abstime;
abstime.tv_sec = valtime.tv_sec;
abstime.tv_nsec = valtime.tv_usec * 1000;
ret = pthread_cond_timedwait(&m_Cond, &m_Mutex, &abstime);
}
#else
struct timespec abstime;