0

C# でのマルチスレッドは初めてです。しかし、C# の本やチュートリアルのさまざまな章を読むことから。マルチスレッド アプリケーションで使用されるクラスを開発する最善の方法は、不変のクラスを作成することです。

しかし、読み取り/書き込みプロパティを公開するクラスをどのように扱うかについてはよくわかりません。私が読んだいくつかの記事では、著者が読み取り/書き込みプロパティの周りにロックを配置しました。

public class Test
{
  private string property1;

  public string ClassProperty
  {
   get
   {
     lock 
     {
       return Property1;
     }
   }
   set
   {
      lock 
      {
        Property1 = value;
      }
   }
 }
}

クラス内で宣言および使用される共有変数は、マルチスレッド アプリケーションでロックする必要があることを私は知っています。しかし、私が読んだいくつかの記事では、公開されているプロパティが参照型の場合、上記のコードは機能しないことが示唆されています。他の人は、公開されたプロパティを持つクラスをスレッドセーフにすることはできないと示唆していますか? 誰かがこのトピックについて明確な答えを持っていますか?

ありがとう

4

2 に答える 2

2

このコード サンプルは、オーバーヘッドを追加する以外には何もしません。とにかく、C# String オブジェクト自体はスレッドセーフであり、ポインターの読み取り/書き込みは常にアトミックです。そのコード サンプルは、double または struct に対してのみ意味があります。

個々のプロパティをスレッドセーフにすることは、より大きな論理操作を「アトミック」にすることと同じくらい考えるべきではありません。たとえば、2 つのフィールド foo と bar があり、常に bar == lowercase(foo) である必要がある場合、それらのいずれかにアクセスする操作を同じロックで保護する必要があります。

より良い例は、ベクターとハッシュの両方に含まれる必要があるオブジェクトです。

  • 追加するときは、ベクターとハッシュの両方をロックし、ロックの下で両方を更新する必要があります。
  • クエリを実行するときは、ハッシュをロックし、値をフェッチし、ロックを解除して返す必要があります。
  • 反復するときは、ベクトルのコピーを返すか、呼び出し元がロック パターンを理解していることを確認する必要があります。
于 2012-11-16T11:30:23.103 に答える
0

参照型の問題は、参照の取得のみをロックしていることです。型への参照を取得すると、その型自体がスレッド セーフをサポートしていない限り、安全でない方法で型のメンバーにアクセスできます。

于 2012-11-16T11:19:44.663 に答える