線程池的使用

1.對線程的學習

線程池是一種多線程處理形式,處理過程中將任務添加到隊列,然後在創建線程後自動啓動這些任務。線程池線程都是後臺線程。每個線程都使用默認的堆棧大小,以默認的優先級運行,並處於多線程單元中。如果某個線程在託管代碼中空閒(如正在等待某個事件),則線程池將插入另一個輔助線程來使所有處理器保持繁忙。如果所有線程池線程都始終保持繁忙,但隊列中包含掛起的工作,則線程池將在一段時間後創建另一個輔助線程但線程的數目永遠不會超過最大值。超過最大值的線程可以排隊,但他們要等到其他線程完成後才啓動。

2.線程的創建

#include "thread.h"
namespace SEOS
{
int Thread::ThreadCreate(ThreadFunc pFunc,void* param1,Thread& outThread)
{
int threadid;
HANDLE h = CreateThread(0,0,(LPTHREAD_START_ROUTINE)pFunc,param1,0,(LPDWORD)&threadid);
if(h == INVALID_HANDLE_VALUE)
{
return -1;
}
outThread.Set(h,threadid);
return 0;
}
}

線程參數的說明

function CreateThread(
  lpThreadAttributes: Pointer;           {安全設置}
  dwStackSize: DWORD;                    {堆棧大小}
  lpStartAddress: TFNThreadStartRoutine; {入口函數}
  lpParameter: Pointer;                  {函數參數}
  dwCreationFlags: DWORD;                {啓動選項}
  var lpThreadId: DWORD                  {輸出線程 ID }
): THandle; stdcall;                     {返回線程句柄}

3。線程池的組成

1、線程池管理器(ThreadPoolManager):用於創建並管理線程池
2、工作線程(WorkThread): 線程池中線程
3、任務接口(Task):每個任務必須實現的接口,以供工作線程調度任務的執行。
4、任務隊列:用於存放沒有處理的任務。提供一種緩衝機制。

3.線程池的使用示例

自定義線程池

#pragma once
#include <vector>
#include "os/thread.h"
using namespace std;
class Task
{
public:
virtual void Do() =0;
};
class ThreadPool
{
public:
ThreadPool();
~ThreadPool();
void Init(uint8 threadNum,uint32 queueLength);
void Stop();
void AddTask(Task* pTask);
int Run();
protected:
static int WorkThread(void* param);
// vector<ResIdType> _vecReqeust;
vector<SEOS::Thread> _vecThread;
CapacityQueue<Task> _queue;
};

線程池的接口,包含初始化,啓動,對線程池的接口實現

#include "ThreadPool.h"
//#include "Log.h"
ThreadPool::ThreadPool()
{
}
ThreadPool::~ThreadPool()
{
}
void ThreadPool::Init(uint8 threadNum,uint32 queueLength)
{
for(int i=0;i<threadNum;++i)
{
SEOS::Thread thread;
int ret = SEOS::Thread::ThreadCreate(ThreadPool::WorkThread,this,thread);
if(ret != 0)
{
//LOG("ThreadPool create thread failed");
}
_vecThread.push_back(thread);
}
_queue.SetCapacity(queueLength);
}
int ThreadPool::WorkThread(void* param)
{
ThreadPool* pThis = (ThreadPool*)param;
return pThis->Run();
}
int ThreadPool::Run()
{
while(1)
{
Task* pTask = _queue.pop();
if(pTask == NULL)
{
Sleep(100);
continue;;
}
else
{
pTask->Do();
}
}
}

發佈了42 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章