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  | 큐잉되는 시간

comments powered by Disqus