2

がある:

1つの条件変数"var":varの値は0または1のみです。

1つのプロバイダースレッド「thP」:ネットからデータを受信したら、var 1(使用可能)を設定します。

1つのコンシューマスレッド「thC」:varのwait()。varを取得したら、0(使用不可)に設定し、後で何かを処理します。

この単純なモデルを実装する2つの方法を見つけました。

(1)変数としてpthread_cond_tを使用します。このメソッドには、スレッドがクリーンアップされている間にミューテックスのロックを解除するための追加のミューテックスとコールバック関数が必要です。

(2)sem_tをvarとして使用します。このメソッドは、「var>1」の状況を引き起こす可能性があります。thCは、varの値を1に減らすために、複数のwait()操作を実行する場合があります。

質問は:

この単純なモデル「単一プロバイダー、単一コンシューマー、1つの条件変数」を実装するには、var、pthread_cond_t、sem_tにどのタイプを使用するか、または単にpthread_mutex_tをバイナリセマフォとして使用する必要がありますか?

どうもありがとう!

4

1 に答える 1

1

単一のコンシューマー、単一のプロバイダー、制限付きキューの例では、通常、これを行うには、2つの条件変数を保護する1つのロックを使用します(1つは「キューがいっぱいでない」ときに通知され、もう1つは「キューが空でない」ときに通知されます)。

アルゴリズムは次のようになります。

post(item):
  lock;
  while (queue is full):
    wait(cvar_queue_not_full);
  queue.push(item)
  signal(cvar_queue_not_empty);
  unlock;

consume():
  lock;
  while (queue is empty):
    wait(cvar_queue_not_empty);
  item = queue.shift(item);
  signal(cvar_queue_not_full);
  unlock;
  return item;

これは本質的に制限付きセマフォですが、セマフォをアトミックに調整し、同時にキューをプッシュ/ポップすることができます。残念ながら、POSIXセマフォには制限がなく、原子性はありません。

于 2012-04-26T04:21:42.007 に答える