2006-06-01
QueueUserWorkItem()
Windows 에서 제공하는 ThreadPooling API인 QueueUserWorkItem()에 대해서 알아보자.
QueueUserWorkItem()
Programming Application for Microsoft Windows 에 의하면 ThreadPooling 시 새로운 쓰레드가 추가되기 위한 factor 에는 아래와 같은 것이 있다.
- 쓰레드가 추가된 지 몇 초가 지나면, 한번 고민해본다
- WT_EXECUTELONGFUNCTION 이 사용될 경우, 한번 고민해본다
- 큐잉된 작업의 개수가 일정 threadhold 를 넘어설 경우, 한번 고민해본다.
그러나, 상세한 파라미터는 알려져 있지 않아서.. 테스트를 해 보았다.
const int MAX_WORK = 1000;
LONG WorkCounter = 0;
int add_time = 1;
int work_time = 10;
int nloop = 1;
bool bPreQueue = false;
int pre_queue_time = 1000;
bool bMiddleSleep = false;
int middle_sleep_time = 1000;
DWORD WINAPI MyWorkThreadProc(PVOID pParam)
{
MyWork* pWork = (MyWork*)pParam;
Sleep(pWork->workTime);
pWork->threadID = ::GetCurrentThreadId();
pWork->output = pWork->input * 2;
InterlockedIncrement( &WorkCounter );
return 0;
}
void
thread_pool_test_fixture::test_really_pooling()
{
for ( int k = 0 ; k 0 )
{
Sleep(pre_queue_time);
}
}
MyWork works[MAX_WORK];
for (int i=0; i 0 )
{
Sleep(add_time);
}
if ( i == 500 && bMiddleSleep && middle_sleep_time > 0 )
{
Sleep( middle_sleep_time );
}
}
while ( WorkCounter threads;
for (int i=0; i::iterator itr = threads.begin() ; itr != threads.end() ; itr ++ )
{
BOOST_MESSAGE( *itr 처리 시간 |
| 10 | 10 | 1 | 큐잉되는 시간 == 처리 시간 |
| 10 | 20 | 3 | 큐잉되는 시간