をコピーせずにリストにアクセスを読むには、次の例を考えてみましょうか? C#には同時のCollections
がありますが、スレッドセーフリストはありません。 JavaではCopyOnWriteArrayList
のようなものがあります。C#の並列は
Q
C#の並列は
7
A
答えて
6
私の意見ではからImmutableList<T>
クラスからこのようなシナリオにはパッケージが最適です。それはIReadOnlyList<T>
を実装しており、変更できない、つまり変更されていないため、読み取りアクセッサから直接返すことができます。変更操作の間になり、必要なときだけ同期:
class Example
{
private ImmutableList<string> _list = ImmutableList<string>.Empty;
private readonly object _lock = new object();
public IReadOnlyList<string> Contents => _list;
public void ModifyOperation(string example)
{
lock (_lock)
{
// ...
_list = _list.Add(example);
// ...
}
}
}
1
ロックフリーの提案...
class Example
{
private ImmutableList<String> _list = ImmutableList<String>.Empty;
public IReadOnlyList<String> Contents { get { return _list; } }
public void ModifyOperation(String example)
{
ImmutableList<String> original;
ImmutableList<String> afterChange;
do
{
original = _list;
afterChange = _list.Add(example);
}
while (Interlocked.CompareExchange(ref _list, afterChange, original) != original);
}
}
+0
非常に良い。ありがとう! – Nico
関連する問題
- 1. C#の並列パーティションアルゴリズム
- 2. C#の並列パイプライン
- 3. GPU並列プログラミングC/C++
- 4. C++での並列ループ
- 5. Cでの並列再帰
- 6. C#の並列プログラミングに、Epplus
- 7. C++/cliの並列forループ
- 8. Windows上のC/C++用の並列API
- 9. C#/ C++での同期並列処理
- 10. C#並列戻り値
- 11. C - 並列再帰omp
- 12. 並行処理と並列処理 - 具体的にはC++で
- 13. 並列C++でのメモリの設定
- 14. C#で配列の列を並べ替える方法は?
- 15. Parallel.ForeachとCでの並列実行
- 16. C#の場合と並列バッチロジック
- 17. C#CSV解析の並列化
- 18. Cとmathematicaの並列計算
- 19. C#4.0の推奨マルチスレッド/並列コンピューティングブック
- 20. は並列
- 21. ErlangおよびCライブラリ。並列実行
- 22. C++ asyncを使用した並列プログラミング
- 23. Cで並列タスクを実行
- 24. C#並列ループローカル変数スレッドセーフ情報
- 25. 並列c#使用済みコア数
- 26. c#並列foreachループ検索インデックス
- 27. C++ 17並列化ハードウェア実装
- 28. C++フォーク結合並列処理ブロッキング
- 29. C++の選択文字列配列の並べ替え
- 30. C++ 17/C++ 1z std :: for_eachの並列使用
方法について 'ImmutableList'](https://msdn.microsoft.com/ 「System.Collections.Immutable」パッケージのen-us/library/dn467185(v =対111).aspx) –
ブロックコレクションについてはどうですか? (https://msdn.microsoft.com/en-us/library/dd267312(v=vs.110).aspx) – derape
他のコード(おそらく別のスレッド)が呼び出されている間に 'ModifyOperation() 'Contents'から返されたオブジェクトへのアクセス権を持っていれば、コピーしないで' List 'を返すとスレッドセーフではなくなります。 –