今日の以前の質問からセマフォについて学びましたが、ここでまだ頭を悩ませています。グローバルとローカルを超えたスコープについての議論はないようです。グローバルはオペレーティング システム全体として定義されます。
複数のアセンブリから作成されたアプリケーションがあり、各アセンブリに複数のクラスがあり、各クラスにプライベートな静的セマフォ オブジェクトがあり、「キュー」の長さが異なる場合、アプリケーション スレッド プールのさまざまな場所でさまざまなタスクをキューに入れ始めると、それはどのように機能しますか?スレッドは互いにどのように動作しますか? 私が目にするすべての例には、1 つのアセンブリに 1 つまたは 2 つのクラスが含まれており、これがどのように機能するかについて明確なイメージが得られません。
アプリ全体でスレッド プーリングを使用しています。インターフェイスの応答性を維持しながら、データを並列化します (カスタマイズされた電子メールをさまざまな人に送信する、カスタマイズされたレポートをまとめて生成する、さまざまな Web サービスからデータを収集するなど)。これは素晴らしいことです。
私の Web サービス ソースの 1 つは、同時接続を 5 つに制限しており、アプリケーションの残りの部分が必要に応じて他のスレッドを利用できるようにしながら、Web 要求を 5 つのアクティブなスレッドに制限する方法を理解できませんでした。それで、私はSOに目を向けて、それを行う方法を尋ねました。提案された答えは、セマフォを使用することでした。
それまでセマフォのことを知らなかったので調べてみました。確かに、特定のメソッドを実行するスレッドの数を制限しているように見えますが、これがスレッド プール マネージャーとどのように適切に通信するかは意味がありません。Web 要求機能にセマフォを実装し、Web サービス呼び出しの実行を待機しているスレッドのバックログを取得した場合、スレッド プールは他のプロセスに追加のスレッドを発行することをどのように認識しますか (認識できますか?)。セマフォのスコープはプライベートです。オブジェクトは表示されません。
さらに、それはセマフォがすべきことですか?同様に、共通のセマフォを共有することで、他のグループのタスクを制限できますか? これは、セマフォの意図の粗悪品なのか、それともまさにそれが何をするつもりなのか. そこには非常に多くの情報がありますが、単純化された抽象的な形式であり、これらをいつどのように使用するのが適切かを説明した記事を見つけることができませんでした.
では、プライベート スタティック セマフォはどのようにしてスレッド プールと通信し、スレッド プールが別のワーカー スレッドを生成するかどうかを判断するのでしょうか? そうですか?これを行うことで、解決策よりも多くの問題を生み出すことになりますか? Web 要求のバックログで、スレッド プールがどのような動作を示すと予想できますか? 「いっぱい」になるまでWebリクエスト用の新しいスレッドを生成し、他のメソッドのスレッドの可用性を低下させますか? そうしないようにできますか?