뮤텍스, 조건 변수 및 스레드 ID를 사용하여이를 달성 할 수 있습니다.
뮤텍스를 잠금 해제하기 전에 스레드는 대상 스레드 ID를 설정하고 조건 변수를 브로드 캐스트하고 뮤텍스를 해제합니다. 대기중인 스레드가 깨어나서 뮤텍스를 잠그고 대상 스레드 ID가이 스레드 ID와 같은지 확인하십시오. 그렇지 않으면 스레드가 대기 상태로 되돌아갑니다.
대기중인 모든 스레드를 깨우지 않고 대상 스레드 ID를 확인한 다음 다시 대기하는 것을 피하기 위해이 방법을 최적화하면 대기중인 각 스레드에 대해 별도의 조건 변수를 사용하게됩니다. 이 방법으로 시그널링 쓰레드는 특정 타겟 쓰레드의 조건 변수를 알린다.
또 다른 옵션은 특정 스레드로 보낸 신호를 사용하는 것입니다. 이를 위해 SIGRTMIN
을 사용한다고 가정 해 보겠습니다. 먼저 모든 스레드가 시작시이 신호를 차단하므로 신호가 보류 상태가되고 스레드가 스레드를 기다리지 않을 때 신호가 손실되지 않습니다. 스레드가 뮤텍스를 잠그려고 할 때 먼저 sigwait()
을 호출하여 SIGRTMIN
을 원자 적으로 차단 해제하고 기다리거나 이미 보류중인 것을 전달합니다. 스레드가 신호를 받으면 뮤텍스를 진행하고 잠글 수 있습니다. 시그널링 쓰레드는 pthread_kill(target_thread_id, SIGRTMIN)
을 사용하여 특정 쓰레드를 깨운다.
당신이 얻을 수있는 유일한 보장은 일부 메커니즘에서는 공정성이지만, 필요한 기능은 없습니다. 어떤 스레드가 먼저 통과하는지에 의존하지 않도록 알고리즘을 재 설계 할 수 있습니까? 아마도 당신이하는 일을 설명하면 우리는 어떤 것을 생각할 수 있습니다. – Tudor
그것은 교착 상태를 방지하는 핵심 요소입니다. 중요한 섹션에 있으며 다른 중요한 섹션을 잠글 예정입니다. 그러나, 나중에 CS가 잠겨 있고 이전 CS를 잠그려고 시도하는 또 다른 스레드가 있다는 것을 알고 있습니다. 교착 상태를 막기 위해 이전 스레드를 잠그려는 시도를 취소해야하는 다른 스레드에 알릴 필요가 있습니다. –
각 스레드가 같은 순서로 모든 잠금을 획득 할 수 있습니까? 그렇다면 교착 상태 문제는 발생하지 않습니다. – Tudor