首页 > 其他分享 >线程池

线程池

时间:2023-04-20 22:44:57浏览次数:31  
标签:mtx pTask CThreadPool 线程 nThreadCnt pThis NULL

#include "CThreadPool.h"

bool CThreadPool::Create(uint32_t nThreadCnt)
{
  //创建信号量
  m_hSemphore = CreateSemaphore(NULL, 0, MAXLONG, NULL);
  //check ...

  //创建线程
  if (nThreadCnt == -1)
  {
    SYSTEM_INFO si;
    GetSystemInfo(&si);

    nThreadCnt = si.dwNumberOfProcessors;
  }

  m_bRunning = true;

  for (size_t i = 0; i < nThreadCnt; i++)
  {
    HANDLE hThread = CreateThread(
      NULL,                        // no security attributes 
      0,                           // use default stack size  
      WorkThread,                  // thread function 
      this,                // argument to thread function 
      0,                           // use default creation flags 
      NULL);                // returns the thread identifier 
    //check ...

    m_aryThreads.push_back(hThread);
  }

  return true;
}

bool CThreadPool::Destroy()
{
    return false;
}

void CThreadPool::AddTask(ITask* pTask)
{
  //添加任务
  m_mtx.lock();
  m_queTasks.push(pTask);
  m_mtx.unlock();

  //释放信号
  ReleaseSemaphore(m_hSemphore, 1, NULL);
}

DWORD __stdcall CThreadPool::WorkThread(LPVOID lpParameter)
{
  CThreadPool* pThis = (CThreadPool*)lpParameter;
  while (pThis->m_bRunning)
  {
    //等待任务
    WaitForSingleObject(pThis->m_hSemphore, INFINITE);

    //获取任务,执行
    pThis->m_mtx.lock();
    ITask* pTask = pThis->m_queTasks.front();
    pThis->m_queTasks.pop();//出队
    pThis->m_mtx.unlock();

    pTask->ExcuteTask();
    delete pTask;
  }

  return 0;
}
#pragma once
#include <queue>
#include <mutex>
#include <Windows.h>

class ITask
{
public:
  virtual void ExcuteTask() = 0;
};

class CThreadPool
{
public:
  bool Create(uint32_t nThreadCnt = -1);
  bool Destroy();
  void AddTask(ITask* pTask);

private:
  std::queue<ITask*>   m_queTasks;     //任务队列
  std::recursive_mutex m_mtx;
  HANDLE               m_hSemphore{};  //信号量
  std::vector<HANDLE>  m_aryThreads;   //线程

  bool                m_bRunning{false};
  static DWORD WINAPI WorkThread(LPVOID lpParameter);
};

 

标签:mtx,pTask,CThreadPool,线程,nThreadCnt,pThis,NULL
From: https://www.cnblogs.com/yewu1/p/17338613.html

相关文章

  • java ThreadPool 线程池
    线程池的参数corePoolSize为核心线程;maximunPoolSize为最大线程;keepAliveTime为最长生命时间;unit是其时间单位;workQueue任务队列;handler是过多线程之后的策略对于线程池的处理线程机制,网上有一堆,但是机制核心是优先处理核心线程,优先堆满线程池,初学者建议不用轻易使用拒绝策略,除非......
  • 【调试】Valgrind内存泄漏内存越界|运行时间|调用|cache命中率|多线程竞态|堆栈分析..
    目录即看即用详细简介Valgrind工具详解安装使用检测内存泄漏其他内存问题memcheck工具的常用选型其他选项附录其他类似工具实例分析:03.使用未初始化的内存04.使用野指针05.动态内存越界访问06.分配空间后没有释放07.不匹配使用delete或者free08.两次......
  • java线程同步和异步的区别
    在Java中,同步和异步是指多线程并发执行中的两种不同的机制。同步指的是线程之间的协作方式,即当一个线程在执行一个任务时,其他线程必须等待该线程执行完该任务后才能执行同一段代码。同步机制通常使用synchronized关键字或Lock对象进行实现,以保证多线程共享的资源同步访问。 ......
  • Java多线程基础
    1、创建线程类的方法1.1、继承Thread类当一个类继承了Thread类,该类就可以当做线程使用我们会重写run方法,写上自己的业务代码run方法是Thread类实现了Runnable接口的run方法1.1.1、入门案例/***@authorCarl*@version1.0*/publicclassThread01{public......
  • java线程同步和异步的区别
    在Java中,同步和异步是指多线程并发执行中的两种不同的机制。同步指的是线程之间的协作方式,即当一个线程在执行一个任务时,其他线程必须等待该线程执行完该任务后才能执行同一段代码。同步机制通常使用synchronized关键字或Lock对象进行实现,以保证多线程共享的资源同步访问。异步指的......
  • 线程方法的基本使用
        ......
  • C#多线程、异步
    1.如果数据仅用于展示,或者对数据的获取没有先后要求,可以使用如下线程privatevoidAutoUpdate_Loaded(objectsender,RoutedEventArgse){ThreadThreadUpdate=newThread(Update);}privatevoidUpdate(){try{Thread.Sleep(2000);//执行更新ExcuteUpdate();D......
  • Shell多线程备份数据库
    Shell这么简单的脚本语言有多线程这一说吗?答案是有的。只不过它实现起来稍微有点难理解罢了,因为它借助了命名管道实现。所谓多线程就是原本由一个进程完成的事情现在由多个线程去完成。假如一个进程需要10小时完成的事情,现在分配10个线程,给他们分工,然后同时去做这件事情,最终可能就......
  • 900万大数据量 查询 更新 使用redis 多线程请求
    表A中有900多万数据,根据900万数据,查询数据并插入B表创建一个定时任务,定时查询配置条件,查询更新(查询更新使用多线程)预估时间,设置请求时间跟频率不想这么干:可以查看数据执行进度思路:设置一个运行队列runList里面是待执行的id设置一个失败队列failList里面是执行失败的i......
  • 【线程基础】【五】yield、sleep、wait方法的异同
    1 前言本节我们讲下Thread.yield()方法的作用,并对比下sleep()方法、wait()方法,看看三者有何区别。2 yield方法作用是:提出释放CPU时间片的请求,不会释放锁,主要知道它不会阻塞线程即可哈,平时我是没怎么用过哈。特点就是:(1)yield()方法只是提出申请释放CPU资源,至于能否成功释放......