静的なThreadLocalを使用して重量のあるオブジェクトをキャッシュします。各インスタンスが作成されたときのdoSomething()は、複数のタスク並列ライブラリのスレッドから呼び出されるとThreadLocalとTask
class MatchItemFinder
{
private static ThreadLocal<PaddedImage> tempImage;
MatchItemFinder()
{
if(tempImage==null)
tempImage = new ThreadLocal<PaddedImage>(
() => new PaddedImage(patchSize, patchSize));
}
internal void DoSomething(){
//Do something with tempImage.Value
}
}
:?次のコードを考えてみましょうか私は明らかにスレッドが再利用されることを意味するので、tempImageは、スレッドが作成されるたびに、またはスレッドが再利用されるたびに作成されますか?
デザインパースペクティブでは、このようなキャッシングは大きな決定になると思いますか、大きなオブジェクトをスレッドセーフな方法でキャッシュする方が良いでしょうか?
私は、ローカル変数は、TPLまたはスレッドプールに協力していない。ネット4.
http://stackoverflow.com/questions/854976/will-values-in-my-threadstatic-variables-still-be-there-when-cycled-via-threadpo –
キャッシュの目標は何ですか?あなたは本当にすべてのスレッドに大きなオブジェクトのコピーを持たせたいのですか?または、あなたは本当にすべてのスレッドを持つ*単一の*大きなオブジェクトを共有することを見ていますか?スレッドセーフな方法でですか?後者の場合は、[Lazy](https://msdn.microsoft.com/en-us/library/dd642331(v = vs.110).aspx)クラスをご覧ください。 – sstan
@sstanあなたは正しい質問をしています。私は本当に大きなオブジェクトの250のインスタンスのようにしたくないです。理想的な状況は、特定の時刻に8つのハイパースレッドコアに対応する8つのインスタンスのようなtempImageで実際に何かを実行している同時スレッドの数と同じ数のインスタンスを持つことです。レイジーは初期化に関するものではないので、仕事をしません。大きなオブジェクトはDoSomething()によって操作される一時的な画像なので、ここでは単一のインスタンスは機能しません。 –