Graphics Programming

맨날 까먹는 std 컨테이너 resize와 reallocate 본문

Season 2

맨날 까먹는 std 컨테이너 resize와 reallocate

minseoklee 2019. 3. 9. 15:45

멀티쓰레딩 하려고 쓰레드 풀 만들다가 또 당했다.


// std::vector<ThreadPoolWork> queue;


bool ThreadPool::PopWork(ThreadPoolWork& work)

{

    bool ret = true;


    queueLock.lock();


    if(queue.size() == 0)

    {

        ret = false;

    }

    else

    {

        work = queue[queue.size() - 1];

        queue.pop_back();

    }


    queueLock.unlock();


    return ret;

}


얼핏 아무 문제 없어보였는데 pop_back()을 하면서 queue의 크기가 변하고, reallocate되어버렸다. 쓰레드 엔트리 함수에 work에 대한 포인터를 인자로 넘길 건데, 컨테이너가 재할당돼서 메모리 위치가 바뀌어버렸고 작업 쓰레드에서 work를 디레퍼런싱하면 쓰레기 값이 나온다.


work item 몇 개는 제대로 처리하다가 터지는 것에서 컨테이너 재할당을 눈치챘어야 했는데 시간이 좀 걸렸다.


bool ThreadPool::PopWork(ThreadPoolWork& work)

{

    bool ret = true;


    queueLock.lock();


    if(queueIx < 0)

    {

        ret = false;

    }

    else

    {

        work = queue[queueIx];

        --queueIx;

    }


    queueLock.unlock();


    return ret;

}


그래서 재할당 안 되게 바꾸고 작업 큐는 작업 다 끝나면 한꺼번에 삭제,


고치고 나니까 예전에 쓰레드 풀 만들 때도 똑같은 실수를 한 게 떠올랐다. 실수는 반복하면 안되는데 ㅜㅜ


Comments