문제

현재의 이해를 조건 변수를 모두 차단(대기)스레드에 삽입하는 기본 FIFO 는 첫 번째 항목은 깨어날 때 신호()를 호출합니다.

어떤 방법이 있을 수정이 이 큐(를 만들거나 새로운 구조)역할을 수행하고 우선 순위를 사?나는 그것에 대해 생각하는 동안,하지만 대부분의 솔루션을 나는 끝을 방해하여 기존의 큐 구조를 고유하 C.V. 및 뮤텍스.

감사합니다!

도움이 되었습니까?

해결책

나는 당신을 생각해야 재고 당신이 무엇을 행하려고 노력하는 것입니다.하려는 경우신의 성능을 최적화하기 위해,당신은 아마 짖는 잘못된 나무입니다.

pthread_cond_signal() 지 않도록 보장 차단을 정확히 하나의 스레드-그것을 보장단 하나의 스레드,그래서 당신의 코드를 처리할 수 있는 상황이 여러 스레드 해제시오.전형적인 방법은 각 스레드를 위해 다시 상태를 확인한 후 되는 차단되지 않은 경우 false 를 반환하는 기능을 제공합니다.

구현할 수 있는 몇 가지 종류의 체계 어디에 당신이 지켜 자신의 우선 순위 큐의 스레드를 기다리고,그리고 각 스레드 추가 자체 큐에 즉시 전에 시작하고,다음은 것이 확인 큐 때는 차단하지만,이것은 추가 많이 복잡하고 잠재력을 많이 심각한 문제(레이스,교착 상태,etc.).그것은 또한 추가 아닌 사소한 금액의 오버헤드가 발생합니다.

또한,무엇이 발생하는 경우 우선 순위가 높은 실기를 기다리고 시작한 조건에 변수를 동일한 순간에 그 조건 변수는 신호?누가 차단,새로 도착 우선 순위가 높은 실 또는 이전 가장 높은 우선순위가 실?

순서는 스레드를 얻을 차단은 전적으로 의존에서 커널의 스레드 스케줄러는,그래서 당신은 그것의 자비에 있습니다.지 않다고 가정 FIFO 주문,중 하나입니다.

다른 팁

조건 변수는 기본적으로 장벽 일 뿐이며 대기 스레드 대기열을 제어 할 수 없으므로 우선 순위를 적용 할 수있는 실제 방법은 없습니다. 대기실이 FIFO 방식으로 작동한다고 가정하는 것은 유효하지 않습니다.

원자력, 추가 조건 변수 및 관련된 스레드/우선 순위에 대한 사전 지식의 조합을 사용하면 신호 된 스레드가 마스터 CV를 다시 신호하고 우선 순위 CV에서 재 블록하는 솔루션을 구성 할 수 있지만 확실히 그렇습니다. ' 일반적인 솔루션이 아닙니다. 그것은 또한 내 머리 꼭대기에서 벗어나서 다른 결함이있을 수도 있습니다.

실행되는 스레드를 결정하는 것은 스케줄러입니다. 당신은 볼 수 있습니다 pthread_setschedparam 그리고 pthread_getschedparam 그리고 정책과 함께 바이올린 (SCHED_OTHER, SCHED_FIFO, 또는 SCHED_RR) 그리고 우선 순위. 그러나 아마도 내가 당신이 가고 싶다고 생각하는 곳으로 당신을 데려 가지 않을 것입니다.

마치 본질적으로 비 결정적으로 예측할 수있는 것을 만들고 싶은 것처럼 들립니다. Andrew는 당신이 무언가를 해킹 할 수 있지만 내 추측은 6 개월 (또는 둘 다) 안에 글을 쓰는 것을 싫어할 심장 박동 또는 많은 코드로 이어질 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top