1

스레드 안전 큐를 사용하는 프로젝트에서 작업하고 있습니다. 그것은 기본적으로 생산자/소비자 문제입니다. 내 코드는 현재 수행생산자/소비자, 모든 소비자를 끄기 전에 스레드 안전 큐가 비워 졌는지 확인하는 방법?

는 큐가 비어 있지 않은 경우에도 문제가

void threadCode()//the consumer 
{ 
    while(active) // active is an atomic int, we use it to turn off everything during destruction 
    { 
     threadSafeQueue.popFront();//if queue is empty, it will wait for a signal.The queue has a CV. 
     // process it 
     // if it fails to process it but less than three times, 
     // put it back to the queue to retry later 
    } 
} 

, 활성 내 소멸자 변경 될 0, 모든 스레드가 종료됩니다. 예를 들어 항목을 처리하지 못했을 때 대기열에 다시 넣은 다음 활성 상태는 0입니다.

나는 이것을 원하지 않는다. 대기열의 모든 내용이 처리 된 후 인스턴스가 삭제되기를 바랍니다.

그래서 나는이 시도,

void threadCode() 
{ 
    while(active || queue.size() != 0) 
    { //[1] 
     queue.popFront(); 
     //process 
     // put it back to the queue if it fails less than 3 times 
    } 
} 

queue.size()와 queue.popFront()는 스레드로부터 안전합니다. 하지만 그것들을 합치는 것은 아닙니다 ... 대기열에 남아있는 것이 하나 뿐이고 컨텍스트 전환이 [1]에서 발생하는 경우입니다. 그 실은 영원히 잔다.

소멸자에서 threadpool.join()과 같은 것을 가지고 있기 때문에 그 스레드는 절대로 깨어 나지 않습니다. 문제가 막혔습니다.

이 문제를 해결할 더 좋은 사람이 있습니까?

감사합니다.

+1

요구 사항이 명확하지 않습니다. 언제 문을 닫고 싶니? 누가 결정합니까? 처리되지 않은 wueue 요소가있을 때 종료 할 수 있습니까? 실패 란 무엇을 의미합니까? – Yakk

+0

나는 그 질문이 너무 길어 아무도 그것을 읽을 의향이 없다는 것을 두려워했다. 감사! – zeejan

답변

1

소비자 스레드가 외부 플래그를 확인하는 대신 큐 자체가 내부 "종료 중"플래그를 유지하도록하십시오. 처리 할 작업이 더 이상 없다면 .popFront() 함수는 처리 할 항목 대신 "종료 중"상태를 반환합니다.