IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c++简单实现一个线程池 -> 正文阅读

[C++知识库]c++简单实现一个线程池

#include<iostream>
#include <vector>
#include <pthread.h>
#include <atomic>
using namespace std;
class CThreadPool
{
public:
    CThreadPool()
	{
	}
    ~CThreadPool()
	{
	}
public:
    bool Create(int threadNum);                     //创建该线程池中的所有线程
    void StopAll();                                 //使线程池中的所有线程退出
    void Call();                                    //来任务了,调一个线程池中的线程下来干活
private:
    static void* ThreadFunc(void *threadData);      //新线程的线程回调函数    
private:
    struct ThreadItem
    {
        pthread_t       _Handle;                        //线程句柄
        CThreadPool     *_pThis;                        //记录线程池的指针
        bool            ifrunning;                      //标记是否正式启动起来,启动起来后,才允许调用StopAll()来释放
        ThreadItem(CThreadPool *pthis):_pThis(pthis),ifrunning(false)
        {
        }
        ~ThreadItem()
        {
        }
    };
private:
    static pthread_mutex_t     m_pthreadMutex;      //线程同步互斥量/也叫线程同步锁
    static pthread_cond_t      m_pthreadCond;       //线程同步条件变量
    static bool                m_shutdown;          //线程退出标志,false不退出,true退出
    int                        m_iThreadNum;        //要创建的线程数量
    std::atomic<int>           m_iRunningThreadNum; //线程数, 运行中的线程数,原子操作
    std::vector<ThreadItem *>  m_threadVector;      //线程 容器,容器里就是各个线程了
    std::list<char *>          m_MsgRecvQueue;
};

bool CThreadPool::Create(int threadNum)
{
    ThreadItem *pnew;
    m_iThreadNum =  threadNum;
    int ret = 0;
    for(int i = 0; i < m_iThreadNum; i++)
    {
        m_threadVector.push_back(pnew = new ThreadItem(this));
        ret = pthread_create(&pnew->_Handle, NULL, ThreadFunc, pnew);
        if(ret !=0 )
        {
            printf("create error\n");
        }
    }
    std::vector<ThreadItem *>::iterator pos;
lbfor:
    for(pos = m_threadVector.begin(); pos != m_threadVector.end(); pos++)
    {
        if((*pos)->ifrunning == false)
        {
            usleep(100 * 1000);
            goto lbfor;
        }
    }
    return true;
}


void* CThreadPool::ThreadFunc(void* threadData)
{
    ThreadItem *pThread = static_cast<ThreadItem*>(threadData);
    CThreadPool *pThreadPoolObj = pThread->_pThis;
    CMemory *p_memory = CMemory::GetInstance();
    int err;
    pthread_t tid = pthread_self();
    while(true)
    {
        err = pthread_mutex_lock(&m_pthreadMutex);  
        if(err != 0)
        {
        }
        while((pThreadPoolObj->m_MsgRecvQueue.size() == 0) && m_shutdown == false)
        {
            if(pThread->ifrunning == false)
            {
                pThread->ifrunning = true;
            }
            pthread_cond_wait(&m_pthreadCond, &m_pthreadMutex); 
        }
        if(m_shutdown)
        {
            pthread_mutex_unlock(&m_pthreadMutex); 
            break; 
        }

        err = pthread_mutex_unlock(&m_pthreadMutex); 
        if(err != 0)
        {

        }
        ++pThreadPoolObj->m_iRunningThreadNum;
        --pThreadPoolObj->m_iRunningThreadNum;
    }
    return (void*)0;
}


void CThreadPool::StopAll() 
{
    if(m_shutdown == true)
    {
        return;
    }

    m_shutdown = true;

    int err = pthread_cond_broadcast(&m_pthreadCond); 
    if(err != 0)
    {
        return;
    }

    std::vector<ThreadItem*>::iterator iter;
    for(iter = m_threadVector.begin(); iter != m_threadVector.end(); iter++)
    {
        pthread_join((*iter)->_Handle, NULL);
    }

    pthread_mutex_destroy(&m_pthreadMutex);
    pthread_cond_destroy(&m_pthreadCond);


    for(iter = m_threadVector.begin(); iter != m_threadVector.end(); iter++)
    {
        if(*iter)
            delete *iter;
    }
    m_threadVector.clear();
    return;
}

//来任务了,调一个线程池中的线程下来干活
void CThreadPool::Call()
{
    int err = pthread_cond_signal(&m_pthreadCond);
    if(err != 0 )
    {
		
    }
}
//静态成员初始化
pthread_mutex_t CThreadPool::m_pthreadMutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t CThreadPool::m_pthreadCond = PTHREAD_COND_INITIALIZER;
bool CThreadPool::m_shutdown = false;
CThreadPool g_threadpool;
int main(void)
{
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-28 08:51:02  更:2021-08-28 08:51:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 21:09:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计