私は最近、独自のスレッドプールの実装に取り組んでおり、うまく機能します(ほとんど)。問題は、ほとんどすべての CPU リソースを消費することです。私の実装を見てください:
ThreadPool.h
#include <vector>
#include <list>
#include <Windows.h>
const int DefaultThreadsNumber = 5;
class thread_pool
{
typedef void ( *Task )( );
void* m_hEvent;
CRITICAL_SECTION m_hExecuteFunc;
CRITICAL_SECTION m_hRunFunc;
std::vector<void*> m_ThreadHandles;
std::list<Task> m_TasksQueue;
int m_nThreadInQueue;
static unsigned __stdcall Run( void* thisParam );
public:
thread_pool( int nMaxThreadNo );
~thread_pool();
void Execute( Task task );
};
ThreadPool.cpp
#include "thread_pool.h"
#include <process.h>
void* g_hTaskFinishedEvent;
thread_pool::thread_pool( int nMaxThreadNo )
{
if ( nMaxThreadNo <= 0 )
nMaxThreadNo = DefaultThreadsNumber;
m_nThreadInQueue = nMaxThreadNo;
for( int i = 0; i < nMaxThreadNo; ++i )
{
m_ThreadHandles.push_back((void*)_beginthreadex(NULL, 0, &Run, (void*)this, 0, 0 ));
}
InitializeCriticalSection( &m_hExecuteFunc );
InitializeCriticalSection( &m_hRunFunc );
}
thread_pool::~thread_pool()
{
for ( std::vector<void*>::iterator it = m_ThreadHandles.begin();
it != m_ThreadHandles.end();
++it )
{
CloseHandle( *it );
}
DeleteCriticalSection( &m_hExecuteFunc );
DeleteCriticalSection( &m_hRunFunc );
}
void thread_pool::Execute( Task task )
{
EnterCriticalSection( &m_hExecuteFunc );
m_TasksQueue.push_back( task );
LeaveCriticalSection( &m_hExecuteFunc );
m_hEvent = CreateEvent(NULL, true, false, NULL);
SetEvent( m_hEvent ); // TODO: what if setEvent will fail???
}
unsigned __stdcall thread_pool::Run(void* thisParam )
{
thread_pool *This = (thread_pool*)thisParam;
while(true)
{
WaitForSingleObject( This->m_hEvent, INFINITE );
while(!This->m_TasksQueue.empty())
{
EnterCriticalSection( &This->m_hExecuteFunc );
if ( !This->m_TasksQueue.empty() )
{
This->m_TasksQueue.front()();
This->m_TasksQueue.pop_front();
g_hTaskFinishedEvent = CreateEvent(NULL, true, false, NULL);
SetEvent( g_hTaskFinishedEvent );
}
LeaveCriticalSection( &This->m_hExecuteFunc );
}
}
return 0;
}
どうすれば改善できますか?
よろしくお願いします。