0

マルチスレッドは私をはるかに超えています。特定のコードを求めるのではなく、問題の論理構造について教えてください。

ウェイターが 2 人しかいないレストランがあります。ウェイターは顧客からの注文を即座に受け取ります。つまり、空いている (サービスを提供していない) とすぐに、列の前にいる顧客から注文を受け取り、処理します (サービスを提供します)。これらの注文はランダムに (即時ではなく時間範囲内で) 行われます。顧客は列に並んでおり、その時点でサービスを提供していないウェイターが注文を受けます。

GetInLine()顧客のジェネレーターと呼ばれる関数がありSleep()ます。各顧客が行に追加される前に関数を使用するだけです。

TakeOrders()(おそらく)顧客から注文を受けるという関数があります。ServeCostumer()問題は、その関数で、即座に顧客にサービスを提供する関数呼び出しが行われていることです。その関数を作成するとSleep()、スリープして顧客にサービスを提供しますが、もちろんマルチタスク/スレッドが必要な場合は、次のようにする必要があります。

  • お客様1が来ました
  • ウェイター1が注文しました
  • お客様2が来ました
  • ウェイター2が注文しました
  • 3人来た
  • ウェイター 1 が顧客 1 にサービスを提供した
  • お客さん4人来ました
  • ウェイター 2 が顧客 2 にサービスを提供しました

主にお願いしたいのは、これをコードレベルで視覚化するのを手伝ってもらえますか? つまり

takeorders...ここでロック
ここで
ロック解除

これとあれなどと呼んで
ください。

そんな感じ。

4

1 に答える 1

1

問題の本質は、異なるタイミングで発生する 2 つの別個のアクションが必要なことにあるようです。

  1. 2人のウェイターがすぐに顧客にサービスを提供します(時間がかかります)
  2. ランダムな時間に顧客がキューに追加されます。

ここではミューテックスはおそらくやり過ぎだと思います。本当にロック メカニズムを含めたい場合は、hasBeenServed というスイッチを顧客に追加できます。このスイッチは、顧客にサービスを提供する前にチェックされ、false の場合はウェイターによって反転されます。そうであれば、次の顧客に進みます。

スレッドに関しては、おそらく最も簡単な解決策は、次のスレッドを使用することです。

  1. ウェイター 1
  2. ウェイター 2
  3. 顧客線

そして、それらを一度にキックします。私はマルチスレッドの専門家ではありませんが、おそらくこれが私のアプローチ方法です。

于 2013-05-19T10:46:00.683 に答える