25

HTTP リスナーを使用して作成している HTTP サーバーがあり、特定の変数をスレッド内のどこからでもアクセスできるように宣言したいと考えています。

  • 私の Web サーバー クラスはインスタンス化されているため、実際には静的変数を使用できません。
  • すべてのコードが 1 つのクラスにあるため、インスタンス変数を使用できますが、わかりません。

Dictionary: を使用することを考えDictionary</*[type of Thread ID here]*/,ThreadData>ましたが、スレッドの問題があるのではないかと心配しています。おそらくThreadDataクラス インスタンスになりますが、より効率的な構造体を使用する可能性があります。

  • ディクショナリをスレッド ID にキー設定し、1 つのスレッドがディクショナリ内の独自のエントリのみを要求するようにプログラムすると、ディクショナリにアクセスするときにスレッド関連の問題が発生しますか?
  • 各スレッドは独自のエントリを追加します。新しいスレッド アイテムを追加する間、辞書をロックする必要がありますか? もしそうなら、別のロックオブジェクトを使用して、その間スレッドが自分のデータにアクセスできるようにすることはできますか?

並行辞書を使用する利点はありますか? よりスレッドセーフな別の方法はありますか?

私は現在使用してThreadPool.QueueUserWorkItemいます。これがアイテムごとに新しいスレッドを使用するかどうかはわかりません。そうでない場合は、コンテキストにキーを設定することもできます。

更新: ThreadPool クラス - MSDNによると、スレッドを再利用します。また、スレッドデータはクリアされません。

スレッド プールがスレッドを再利用する場合、スレッド ローカル ストレージまたは ThreadStaticAttribute 属性でマークされたフィールドのデータは消去されません。したがって、メソッドが ThreadStaticAttribute 属性でマークされたスレッド ローカル ストレージまたはフィールドを調べる場合、メソッドが検出した値は、スレッド プール スレッドの以前の使用から残っている可能性があります。

4

4 に答える 4

35

1 つの解決策は、次の属性を持つpublic static fieldを使用することです。ThreadStatic

[ThreadStatic]
public static int ThreadSpecificStaticValue;

ThreadStaticAttribute でマークされた静的フィールドは、スレッド間で共有されません。実行中の各スレッドは、フィールドの個別のインスタンスを持ち、そのフィールドの値を個別に設定および取得します。フィールドが別のスレッドでアクセスされると、別の値が含まれます。

于 2013-03-14T16:22:14.007 に答える
7

スレッド クラスの組み込みストレージ メカニズムを使用できます。

public class Program
{
  private static LocalDataStoreSlot _Slot = Thread.AllocateNamedDataSlot("webserver.data");

  public static void Main(string[] args)
  {
    var threads = new List<Thread>();

    for (int i = 0; i < 5; i++)
    {
      var thread = new Thread(DoWork);
      threads.Add(thread);
      thread.Start(i);
    }

    foreach (var thread in threads) thread.Join();
  }

  private static void DoWork(object data)
  {
    // initially set the context of the thread
    Thread.SetData(_Slot, data);

    // somewhere else, access the context again
    Console.WriteLine("Thread ID {0}: {1}", Thread.CurrentThread.ManagedThreadId, Thread.GetData(_Slot));
  }

}

出力例:

ここに画像の説明を入力

これは、スレッド プールによって生成されたスレッドでも機能します。

于 2013-03-14T16:21:42.510 に答える
0

Webサーバーがインスタンスベースの場合、必要なすべてのデータをそこに保持してみませんか?各インスタンスが特定のスレッドにロックされている場合、問題はありません。

于 2013-03-14T16:08:57.033 に答える
-2

なぜあなたはHTTPサーバーを作成したいのですか、SignalRを使用して、変な答えに見えますが、それについて考えてください

于 2013-03-14T16:25:30.167 に答える