1

私はプロデュースによってファイルを読み取り、消費者によってそれらを他のファイルに書き込んでいます。入力ファイルがプロデューサーによって読み取られると、セマフォの1つを閉じる必要があり、消費者はプロデューサーが新しい入力をバッファーに挿入するのを待ちません。それを行う方法はありますか?

よろしく...

4

1 に答える 1

3

いくつかの可能性:

  • プロデューサーが完了したことを示すフラグを使用します。セマフォからブロックを解除する消費者は、そのフラグを確認し、設定されている場合はクリーンアップする必要があります。プロデューサーがフラグを設定すると、可能なコンシューマーを解放するのに十分な回数、セマフォに信号を送ることができます。何かが消費のためにキューに入れられている競合状態に対処するように注意する必要がありますが、消費者がフラグのチェックを通過する前に「プロデューサー完了」フラグが設定されます。これは、コンシューマ スレッドを先に進めてワーク アイテムをキューから取り出そうとすると、簡単に処理できる可能性がありますが、セマフォが通知されたにもかかわらず、何もすることがない状況をクリーンに処理する必要があります。次に、「プロデューサー完了」フラグを見てもらいます。
  • pthread_kill()待機中のコンシューマーにシグナルを送信するために使用します。これにより、リターン コードsem_wait()を確認できるから除外されます。EINTRこれも、競合を避けるために慎重にコーディングする必要があります。私は POSIX シグナル処理に特に精通していませんが、正しく処理するには細心の注意を払う必要がある独自の荷物が付属していると確信しています。
  • ミューテックスを保持しながらキューの状態と完了条件をアトミックにチェックできるミューテックスで条件変数を使用するように切り替えます。

もちろん、それが完了したらpthread_join()、セマフォが破棄/クローズされる前に、誰か (プロデューサー スレッド?) がすべてのコンシューマー スレッドがクリーンアップされるのを待つ必要があります。

条件変数オプションは、セマフォを使用してコード化されたものを既に持っている場合、おそらくより大きな変更であり、生成および消費される通常のケースではパフォーマンスが低下する可能性があります (おそらく)。しかし、考えられる競合状態について推論し、正しく処理する方が簡単だと思います。簡単だと言っているのではなく、簡単かもしれないことに注意してください。

于 2011-04-11T18:22:40.470 に答える