2011-02-07 3 views
2

이것은 디자인 질문입니다.pthread multithreading

총 6 개의 스레드와 2 개의 FIFO 대기열이 있습니다. 6 개 개의 스레드는 :

  • 2 생산자 queue1을 행 (부호 INT이다) "항목"과 인큐 생산
  • 2 세미 소비자 queue1을하고 대기열로부터 디큐 항목
  • 2 소비자 queue2
  • 로부터 디큐 queue2 할

항목의 총 수는 내 질문은 500

입니다 : 모든 500 개 항목 queue1을의 t를 통해 라우팅하는 동안 내가 어떻게 그 2 반 소비자와 살아 소비자를 유지할 수 있습니다 o 큐 2에서 대기열에서 제외 되었습니까? 생산자 스레드의 경우 전역 항목 수를 유지할 수 있기 때문에 쉽습니다.

그래서 total_entries = 500이면 루틴에서 리턴 (스레드가 종료 됨)됩니다. 나는 해킹 대신 효과적인 방법을 사용하고 싶다.

환경 : Linux, pthread, C/C++.

답변

3

"500 항목"을 알 수없는 일반적인 스레드 응용 프로그램에서는 작업이 완료되었을 때 모든 스레드를 중지하는 것이 전반적인 제어 프로세스에서 더 일반적이라고 생각합니다.

특정 문제에 대해서는 EOF이라는 개념을 FIFO에 추가하여 독자가 "현재 사용 가능하지 않음"과 "다시 사용할 수 없음"을 구별 할 수 있습니다. 이는 sentinal 값만큼 간단 할 수 있습니다 (아마도 0은 스레드에 유효한 값이 아니며이를 나타낼 수 있습니다).

그러면 제작자는 FIFO의 끝을 "닫습니다". 그리고 비어있는 소비자는 EOF을보고 다음 FIFO의 끝을 닫습니다. 실제 파일과 마찬가지로 생산자가 완료되었는지 또는 두 반제품 소비자가 완료되었는지 알 수있는 참조 횟수가 필요합니다.