1

문제를 해결하고 (멀티 태스킹에 대한 더 나은 이해를 위해) 작은 스레드 풀 구현을 작성했습니다. 이 스레드 풀은 스레드 풀의 클라이언트가 추가 할 때 대기열에서 작업을 팝하는 여러 작업자 스레드를 회전시킵니다. 작업 큐가 비어있을 때이 질문의 목적을 위해 작업자 스레드는 모두 종료됩니다.작업자 스레드 활용 극대화

몇 가지 기본적인 벤치마킹을 한 후 응용 프로그램이 대기열 잠금을 획득하기 위해 대기하는 시간의 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); 
    } 
} 
+1

귀하의 앱이 대기열 잠금에 걸린 이유를 확인하려면 몇 가지 코드가 필요합니다. 나는 스레드가 "대기"상태 (조건 변수 또는 유사한 것을 사용하여)에 걸려 있어야한다고 생각합니다. – Starkey

답변

0

당신의 디자인은 각 스레드가 앉아서 자물쇠를 얻기 위해 "회전"할 때 만들어집니다. 이것은 모든 작업자 스레드가 작업을 수행하지 않는 한 끊임없이 발생합니다.이 경우 잠금은 채워지지 않고 작업이 수행됩니다.

모든 스레드가 잠겨있어 잠금 장치를 돌리고 있으면 꽤 많은 CPU 시간을 기다리게 될 것입니다. 이것은 당신의 디자인에 따라 다소 기대됩니다.

작업자 스레드가 적 으면 차단 시간 비율이 크게 줄어들 것입니다. 스레드보다 작업 항목이 많은 지점에서는 잠금 대기 시간이 거의 없습니다.

작업 대기열에 대한 잠금없는 대기열을 사용하는 것이 훨씬 더 나은 설계입니다. 대기열을 기다리지 않아도됩니다. 또한 큐에 작업이있을 때까지 작업자 스레드를 차단할 수있는 대기 핸들을 사용하면 불필요한 회전을 방지 할 수 있습니다.

0

당신은이 작업을 수행하려고 단일 자물쇠, 다중 자물쇠? 뮤텍스? 어떤 대기 의미론을 사용하고 있습니까? 경량 스레드에 파견하는 코드가 포함 된 메인 쓰레드에서

lock(theLock) { 
// ... do lots of work ... 
} 

: 당신이 비슷한을 가질 수

나는 당신의 설명에서 추측 것이다 (이것은 순전히 추측입니다). 이것에 대한 대기 시간이 왜 빨라지는 한 가지 이유는 대기열에 넣었고 실행을 기다리고있는 회전 된 스레드에서 다시 신호를 받아야하기 때문입니다 (다시 말하면 코드를 제공하지 않았으므로 다시 추측합니다).

이 문제를 해결할 수있는 한 가지 방법은 위와 같이 명시 적 잠금을 사용하지 말고 신호가 지정된 뮤텍스를 사용하는 것입니다.이 뮤텍스는 스레드 중 하나가 작동하기를 원할 때 펄스됩니다.

현재 구현을 보지 않고도 그 이상을 할 수 있는지 잘 모르겠습니다.

관련 문제