2017-12-09 34 views
-1

セマフォを使用して同期スレッドを実行しています。今度は、カスタマースレッドがfloor_clerkスレッドのセマフォを使用してキューに到着するまで待つ必要があります。以前はwhileループを使っていました。また、カスタマースレッドは、セマフォーを使用してfloor_clerkによってアシストされるまでも待機する必要があります。私は以前深い睡眠を使ってそれをやっていました。 待ちは、P(セマフォ)(取得)を使用して実装する必要があります。これは待機を行う方法です。 これは次のタスクです。 フロア担当者は、顧客が到着するのを待機します(セマフォを使用します)。どのような情報を必要としていても、彼らを助けます。しかし、フロア担当者は、一度に1人の顧客のみを助けることができます。したがって、顧客は、利用可能な店員を待つ(セマフォを使用する)必要があります。ビジー状態セマフォを使用して待機

待機のための私の以前の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(); 
    // ... 
} 
関連する問題