0

今日の以前の質問からセマフォについて学びましたが、ここでまだ頭を悩ませています。グローバルとローカルを超えたスコープについての議論はないようです。グローバルはオペレーティング システム全体として定義されます。

複数のアセンブリから作成されたアプリケーションがあり、各アセンブリに複数のクラスがあり、各クラスにプライベートな静的セマフォ オブジェクトがあり、「キュー」の長さが異なる場合、アプリケーション スレッド プールのさまざまな場所でさまざまなタスクをキューに入れ始めると、それはどのように機能しますか?スレッドは互いにどのように動作しますか? 私が目にするすべての例には、1 つのアセンブリに 1 つまたは 2 つのクラスが含まれており、これがどのように機能するかについて明確なイメージが得られません。

アプリ全体でスレッド プーリングを使用しています。インターフェイスの応答性を維持しながら、データを並列化します (カスタマイズされた電子メールをさまざまな人に送信する、カスタマイズされたレポートをまとめて生成する、さまざまな Web サービスからデータを収集するなど)。これは素晴らしいことです。

私の Web サービス ソースの 1 つは、同時接続を 5 つに制限しており、アプリケーションの残りの部分が必要に応じて他のスレッドを利用できるようにしながら、Web 要求を 5 つのアクティブなスレッドに制限する方法を理解できませんでした。それで、私はSOに目を向けて、それを行う方法を尋ねました。提案された答えは、セマフォを使用することでした。

それまでセマフォのことを知らなかったので調べてみました。確かに、特定のメソッドを実行するスレッドの数を制限しているように見えますが、これがスレッド プール マネージャーとどのように適切に通信するかは意味がありません。Web 要求機能にセマフォを実装し、Web サービス呼び出しの実行を待機しているスレッドのバックログを取得した場合、スレッド プールは他のプロセスに追加のスレッドを発行することをどのように認識しますか (認識できますか?)。セマフォのスコープはプライベートです。オブジェクトは表示されません。

さらに、それはセマフォがすべきことですか?同様に、共通のセマフォを共有することで、他のグループのタスクを制限できますか? これは、セマフォの意図の粗悪品なのか、それともまさにそれが何をするつもりなのか. そこには非常に多くの情報がありますが、単純化された抽象的な形式であり、これらをいつどのように使用するのが適切かを説明した記事を見つけることができませんでした.

では、プライベート スタティック セマフォはどのようにしてスレッド プールと通信し、スレッド プールが別のワーカー スレッドを生成するかどうかを判断するのでしょうか? そうですか?これを行うことで、解決策よりも多くの問題を生み出すことになりますか? Web 要求のバックログで、スレッド プールがどのような動作を示すと予想できますか? 「いっぱい」になるまでWebリクエスト用の新しいスレッドを生成し、他のメソッドのスレッドの可用性を低下させますか? そうしないようにできますか?

4

2 に答える 2

3

The scope constraints, (if you can call them that!), are because the semaphores are OS kernel synchronization primitives that can be used, (unnamed), for inter-thread comms or, (named), or inter-process, (inter-assembly) comms. The language cannot restrict the scope of the named variant.

There is a huge pile of information on semaphores in general on Google. For .NET-wapped ones, MSDN.

Inter-process signalling and communication via. named semaphores is certainly possible in general. How you might do it in the managed environment is another matter. In unmanaged code, it usually involves other comms elements, like shared memory areas and/or memory-mapped files. You should probably not go there.

Be careful about trying to constrain thread pools in different assemblies by making the tasks signa/wait on named semaphores. By all means try it, if you think it may solve some problem with your app, but there is at least the possibility that the pool thread counts, running pool threads, pool threads blocked on semaphores, pool threads blocked inside tasks on IO etc. may become unstable.

于 2012-04-19T21:42:09.533 に答える
0

唯一の解決策は、組み込みの .NET スレッド プールを分割することであると想定しているようです。タスク グループに個別のカスタム スレッド プールを使用するのはどうですか? Jon Skeet のサンプル コードについては、このリンクを参照してください。

于 2012-04-20T20:01:39.193 に答える