2012-10-03 2 views
2

뮤텍스가 잠겨 있다고 상상해보십시오. 뮤텍스를 잠그기를 기다리는 다른 스레드는 무제한입니다. 뮤텍스의 잠금을 해제하면 해당 스레드 중 하나가 중요한 섹션을 입력하도록 선택됩니다. 그러나 나는 어느 것을 통제 할 수 없다. 특정 스레드가 중요 섹션에 들어가게하려면 어떻게해야합니까?특정 스레드에 뮤텍스의 소유권을 어떻게 부여 할 수 있습니까?

필자는 POSIX 뮤텍스를 사용하여이 작업을 수행 할 수 없음을 확신하지만 다른 동기화 개체를 사용하여 동작을 에뮬레이션 할 수 있습니까?

+0

당신이 얻을 수있는 유일한 보장은 일부 메커니즘에서는 공정성이지만, 필요한 기능은 없습니다. 어떤 스레드가 먼저 통과하는지에 의존하지 않도록 알고리즘을 재 설계 할 수 있습니까? 아마도 당신이하는 일을 설명하면 우리는 어떤 것을 생각할 수 있습니다. – Tudor

+0

그것은 교착 상태를 방지하는 핵심 요소입니다. 중요한 섹션에 있으며 다른 중요한 섹션을 잠글 예정입니다. 그러나, 나중에 CS가 잠겨 있고 이전 CS를 잠그려고 시도하는 또 다른 스레드가 있다는 것을 알고 있습니다. 교착 상태를 막기 위해 이전 스레드를 잠그려는 시도를 취소해야하는 다른 스레드에 알릴 필요가 있습니다. –

+0

각 스레드가 같은 순서로 모든 잠금을 획득 할 수 있습니까? 그렇다면 교착 상태 문제는 발생하지 않습니다. – Tudor

답변

4

뮤텍스, 조건 변수 및 스레드 ID를 사용하여이를 달성 할 수 있습니다.

뮤텍스를 잠금 해제하기 전에 스레드는 대상 스레드 ID를 설정하고 조건 변수를 브로드 캐스트하고 뮤텍스를 해제합니다. 대기중인 스레드가 깨어나서 뮤텍스를 잠그고 대상 스레드 ID가이 스레드 ID와 같은지 확인하십시오. 그렇지 않으면 스레드가 대기 상태로 되돌아갑니다.

대기중인 모든 스레드를 깨우지 않고 대상 스레드 ID를 확인한 다음 다시 대기하는 것을 피하기 위해이 방법을 최적화하면 대기중인 각 스레드에 대해 별도의 조건 변수를 사용하게됩니다. 이 방법으로 시그널링 쓰레드는 특정 타겟 쓰레드의 조건 변수를 알린다.


또 다른 옵션은 특정 스레드로 보낸 신호를 사용하는 것입니다. 이를 위해 SIGRTMIN을 사용한다고 가정 해 보겠습니다. 먼저 모든 스레드가 시작시이 신호를 차단하므로 신호가 보류 상태가되고 스레드가 스레드를 기다리지 않을 때 신호가 손실되지 않습니다. 스레드가 뮤텍스를 잠그려고 할 때 먼저 sigwait()을 호출하여 SIGRTMIN을 원자 적으로 차단 해제하고 기다리거나 이미 보류중인 것을 전달합니다. 스레드가 신호를 받으면 뮤텍스를 진행하고 잠글 수 있습니다. 시그널링 쓰레드는 pthread_kill(target_thread_id, SIGRTMIN)을 사용하여 특정 쓰레드를 깨운다.

+0

예. 나는 그렇게 했어. 스레드를 중요한 섹션에 무작위로 놓고 스레드가 올바른 스레드인지 여부를 확인하는 성능 오버 헤드가 걱정되었습니다. 지금 나는 더 나은 아무것도 생각할 수 없다. –

+0

@MartinSustrik 다른 방법을 추가했습니다. –

관련 문제