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