스레드 안전 큐를 사용하는 프로젝트에서 작업하고 있습니다. 그것은 기본적으로 생산자/소비자 문제입니다. 내 코드는 현재 수행생산자/소비자, 모든 소비자를 끄기 전에 스레드 안전 큐가 비워 졌는지 확인하는 방법?
는 큐가 비어 있지 않은 경우에도 문제가
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()과 같은 것을 가지고 있기 때문에 그 스레드는 절대로 깨어 나지 않습니다. 문제가 막혔습니다.
이 문제를 해결할 더 좋은 사람이 있습니까?
감사합니다.
요구 사항이 명확하지 않습니다. 언제 문을 닫고 싶니? 누가 결정합니까? 처리되지 않은 wueue 요소가있을 때 종료 할 수 있습니까? 실패 란 무엇을 의미합니까? – Yakk
나는 그 질문이 너무 길어 아무도 그것을 읽을 의향이 없다는 것을 두려워했다. 감사! – zeejan