문제를 해결하고 (멀티 태스킹에 대한 더 나은 이해를 위해) 작은 스레드 풀 구현을 작성했습니다. 이 스레드 풀은 스레드 풀의 클라이언트가 추가 할 때 대기열에서 작업을 팝하는 여러 작업자 스레드를 회전시킵니다. 작업 큐가 비어있을 때이 질문의 목적을 위해 작업자 스레드는 모두 종료됩니다.작업자 스레드 활용 극대화
몇 가지 기본적인 벤치마킹을 한 후 응용 프로그램이 대기열 잠금을 획득하기 위해 대기하는 시간의 60 %를 소비하는 것을 발견했습니다. 아마 이것은 대부분 작업자 스레드 내에서 발생합니다.
이것은 단순히 작업자 스레드에 충분한 권한을 부여하지 않았습니까? 작업자 스레드 처리량을 높이기 위해 누락 된 부분이 있습니까?
편집 : 여기에는 약간의 거친 의사 코드가 있습니다. 다음은 작업자 스레드를 실행하는 동안 발표 된 잠금이 획득 한 유일한 두 장소/있습니다 (응용 프로그램의 실행 시간의 대부분입니다.)
std::list<task_t> task_list;
// Called by the client to add tasks to the thread pool
void insert_task(const task_t& task)
{
lock_type listlock(task_mutex);
task_list.push_back(task);
}
// The base routine of each thread in the pool. Some details
// such as lifetime management have been omitted for clarity.
void worker_thread_base()
{
while (true)
{
task_t task;
{
lock_type listlock(task_mutex);
if (task_list.empty())
continue;
task = task_list.front();
task_list.pop_front();
}
do_task(task);
}
}
귀하의 앱이 대기열 잠금에 걸린 이유를 확인하려면 몇 가지 코드가 필요합니다. 나는 스레드가 "대기"상태 (조건 변수 또는 유사한 것을 사용하여)에 걸려 있어야한다고 생각합니다. – Starkey