私は、有限配列(または有限数のバッファー)を使用した標準的な生産者/消費者問題を扱っています。セマフォを使用して実装しようとしましたが、問題が発生しました。プロデューサーに50回だけ「プロデュース」してもらいたい。その後、プロデューサースレッドをメインスレッドに参加させます。この部分は簡単ですが、私ができないのは、コンシューマースレッドに参加することです。それらは、データがないことを示すセマフォ信号に固執しています。この問題を解決するにはどうすればよいですか?
考えられるオプションの1つは、プロデューサーがメインに参加したときにTrueになるフラグ変数を設定し、その後、メインスレッドがワーカースレッドの数と同じ回数のポスト(セマフォ)を実行することです。ワーカースレッドは、ウェイクアップ後に毎回フラグ変数をチェックし、Trueの場合、関数を終了します。
セマフォ後の呼び出しが多いため、私の方法はかなり非効率的だと思います。すべてのスレッドのブロックを一度に解除できれば素晴らしいです!
編集:私が言ったことを実装しようとしましたが、デッドロックのために機能しません
1つのオプションは「ポイズンピル」法です。コンシューマースレッドがいくつ存在するかを知っていることを前提としています。N人の消費者がいると仮定すると、プロデューサーがそれを行った後、N個の「ポイズンピル」をキューに入れます。「ポイズンピル」とは、プロデューサーが通常生成するものと型互換性があるが、通常のオブジェクト/値とは区別できるオブジェクト/値です。
消費者が毒薬を食べたことを認識すると、それは死にます。問題が解決しました。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加