2013-07-28 2 views
0
내가 지금과 같은 작업자 스레드 풀의 일시 정지 메커니즘으로 세마포어를 사용하여 생각 해요

:작업자 스레드에 대한 전역 멈춤으로 셈플을 사용해도 괜찮습니까?

// main thread 
for N jobs: 
    semaphore.release() 
    create and start worker 

// worker thread 
while (not done) 
    semaphore.acquire() 
    do_work 
    semaphore.release() 

지금은 모든 근로자를 일시 정지하려면, 내가 세마포어에서 사용할 수있는 전체 수를 획득 할 수 . 나는 그것보다 더 나은 것이 궁금합니다 :

if (paused) 
    paused_mutex.lock 
    wait for condition (paused_mutex) 
do_work 

또는 더 나은 해결책이 있습니까?

세마포어로 작업하는 한 가지 단점은 모든 작업자가 릴리스 할 때까지 주 스레드가 차단된다는 것입니다. 필자의 경우 반복 당 작업 단위는 매우 작으므로 문제가되지는 않을 것입니다.

업데이트 : 명확한 설명을 위해, 내 직원은 파일 복사본처럼 작동하는 데이터베이스 백업입니다. 파일이 성공적으로 복사되면 while (종료하지 않음) 루프가 종료됩니다. 따라서 전통적인 작업자와의 관계 - 작업 대기 상태 : 작업자가 필요한 파일 복사본을 기다리는 것과 while 루프가 요청한 작업을 수행하는 것입니다. 위 do_work을 do_piece_of_work로 생각할 수 있습니다.

답변

1

세마포어 접근법의 문제점은 작업자 스레드가 지속적으로 작업을 확인해야한다는 것입니다. 그들은 사용 가능한 모든 CPU 자원을 먹고 있습니다. 뮤텍스와 조건 (시그널링) 변수를 사용하는 것이 (두 번째 예제에서와 같이) 스레드가 할 일이있을 때만 깨어나게하는 것이 더 좋습니다.

가능한 한 짧은 시간 동안 뮤텍스를 유지하는 것이 좋습니다. 이를 수행하는 전통적인 방법은 WORK QUEUE를 작성하고 뮤텍스를 사용하여 대기열 삽입 및 제거를 동기화하는 것입니다. 메인 쓰레드는 작업 대기열에 삽입되어 작업자를 깨 웁니다. 작업자는 뮤텍스를 획득하고 대기열에서 항목을 제거한 다음 뮤텍스를 해제합니다. 지금 작업자가 작업을 수행합니다. 이렇게하면 작업자 스레드와 기본 스레드 간의 동시성이 최대화됩니다.

// main thread 
create signal variable 
create mutex 

for N jobs: 
    create and start worker 

while (wait for work) 
    // we have something to do 
    create work item 
    mutex.acquire(); 
    insert_work_into_queue(item); 
    mutex.release(); 

    //tell the workers 
    signal_condition_variable() 

//worker thread 
while (wait for condition) 
    mutex.acquire(); 
    work=remove_item_from_queue(); 
    mutex.release(); 

    if (work) do(work); 

이 모든 작업자 스레드가 하나의 노동자가 실제로 큐의 해제 작업을 얻는 데 성공에도 불구하고, 깨어나 간단한 예입니다 : 다음은 예입니다. 효율성을 더 높이려면 작업자 스레드 당 하나의 조건 변수 배열을 사용하고 원하는대로 간단하거나 복잡한 "다음"알고리즘을 사용하여 "다음"신호를 보내십시오.

+0

직원이 데이터베이스 백업입니다. 그들은 내가 끝내기 전까지 일을 수행하는 점진적인 단계 기능을 제공합니다. 그래서 각 반복마다 항상 기다리고 싶지 않았습니다. 물론 작업자 외부에서 데이터베이스 백업 오브젝트를 설정하고 코드와 유사한 점증적인 작업을 대기열에 넣을 수 있습니다. 그러나 우선 순위가 높은 이벤트가 발생하지 않으면 백업을 일시 중지하거나 중지해야만 가능한 한 백그라운드에서 최대한 빨리 실행되기를 바랍니다. – Harvey

관련 문제