2017-12-09 16 views
-1

세마포어를 사용하여 동기화 스레드를 만들고 있습니다. 이제는 일부 고객 스레드가 floor_clerk 스레드의 세마포를 사용하여 대기열에 도착할 때까지 기다려야합니다. 이전에 while 루프를 사용하여 이전에 작업을 수행했습니다. 또한 고객 스레드는 세마포어를 사용하여 floor_clerk도 도움을받을 때까지 기다려야합니다. 나는 이전에 깊은 수면을 사용하고 있었다. 모든 대기는 P (semaphores) (획득)을 사용하여 구현되어야합니다. 이는 대기를 수행하는 방법입니다. 이것은 다음과 같은 작업입니다. 고객이 도착하기 위해 층원이 대기합니다 (세마포어 사용). 그런 다음 필요한 정보를 제공합니다. 그러나 층원은 한 번에 한 고객을 도울 수 있습니다. 그러므로 고객은 도움이되는 점원을 기다려야합니다 (세마포어 사용). 대기에 대한Busy Waiting using semaphore

내 이전 Floor_clerk 코드는 다음과 같습니다

while (done != Main.csize) {   
    //wait while their is no customer in queue 
    while (queue.isEmpty() && done != Main.csize) { 
    } 

    //while their is a customer in queue assist customers 
    while (queue.size() != 0 && done != Main.csize) { 
     //some stuff to do 
    } 
} 

나를 여기 세마포어를 구현 도와주세요.

+0

제발 도와주세요 ?? –

답변

0

차단 대기열에 클라이언트를 저장하고 take() 메서드를 사용하여 서비스 할 수있는 클라이언트가있을 때까지 차단하십시오. 대기열과 차단 메커니즘은 이미 라이브러리에 내장되어 있기 때문에이를 분리 할 필요가 없습니다.

세마포어를 사용해야 할 경우 세마포어는 기본적으로 "허용"차단 대기열을 사용합니다. 이 차단 기능이 사용자가하려는 일에 어떻게 부합하는지 생각해야합니다. 사용할 수있는 클라이언트가있는 경우 release()에 허가를 허용하고 서비스를 acquire()으로 허용합니다. 허가가 없으면 서비스는 acquire()에서 차단됩니다.

// Add client 
queue.add(client); 
semaphore.release(); 

// Clerk loop 
while (true) { // Whatever condition 
    semaphore.acquire(); 
    Client client = queue.remove(); 
    // ... 
}