2010-11-21 2 views
1

세마포어가 있고 P (s)를 호출하여 대기중인 스레드가 여러 개 있다고 가정합니다. 그러면 V (s)는 그들 사이에 정확히 하나의 스레드를 깨울 것입니다. 시스템이 결정을 내리는 대신 지정된 스레드를 깨울 수있는 방법이 있습니까? 예를 들어 이발소 문제에서 각 이발 후에 이발사는 무작위로 대기하는 고객 대신 가장 오래 기다리는 고객에게 서비스를 제공하려고합니다.V를 사용하여 지정된 P를 깨우는 방법?

+0

'language-agnostic' 태그를 무시한 :'java.util.concurrent.Semaphore'는 선입 선출을 보장하는'fairNess'를 가지고 있습니다. 그러나 이것은 대답이 아닙니다. 지정이 다른 매개 변수에있을 수 있기 때문입니다. – khachik

답변

1

대기열을 사용하여 P를 저장할 수 있습니다. 그것은 당신이 가장 긴 기다림에 근거하여 그것을하게 할 것입니다. 그렇지 않다면 원하는 매개 변수를 기반으로 정렬 된 트리에 저장할 수 있으며 필요한 경우 제거 할 수 있습니다.

필자는 그것의 핵심은 P를위한 메커니즘을 정렬하는 것이라고 생각합니다. 너무 복잡하지는 않습니다.

1

세마포어 구현에 따라 다릅니다. 대기중인 스레드 큐를 생성하고 올바른 순서로 시그널링하는 스마트 세마포어를 사용해야합니다. Windows에서의 일반적인 세마포어 구현은 그렇게 작동하지 않는다고 생각합니다. OS로 신호를 보냅니다. 그러면 신호는 대기중인 모든 스레드로 보내집니다. lifo 스택을 사용하면 더 쉽게 구현되기 때문에 심지어 의미가 있습니다. 그러나 링크 된 목록 또는 순환 배열 일 수있는 큐를 구현하여 직접 작성하는 것은 어렵지 않습니다.

1

아니요, 고전적인 세마포어가 아닙니다. 큐와 같은 동작을 원할 경우 큐의 공유 데이터 구조를 보호하기 위해 큐를 만듭니다 (세마포어 또는 그 중 몇 개를 사용하여).

실제로는, 세마포어는 이론적으로는 동기화가 필요하지만, 베어 메어 (semaphore)를 직접 사용한 실제 코드의 중요한 부분은 거의 쓰지 않습니다. 대부분의 경우, 세마포어를 사용하여 상위 구조를 구축하여 해당 구조의 중요한 데이터를 보호합니다.

관련 문제