Ich verwende ein statisches ThreadLocal, um einige schwergewichtige Objekte zwischenzuspeichern. Betrachten Sie den folgenden Code ein:ThreadLocal und Aufgabe
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
}
}
Wenn DoSomething() von mehreren Task-Parallel Library Threads aufgerufen wird, wenn jede Instanz erstellt wird? Ich meine, offensichtlich Threads werden wiederverwendet, so ist meine tempImage erstellt jedes Mal, wenn ein Thread erstellt wird oder jedes Mal, wenn ein Thread wiederverwendet wird?
Mit einer Design-Perspektive denken Sie, dass diese Art von Caching eine gute Entscheidung wäre, oder gibt es bessere Strategien, um große Objekte in einer Thread-sicheren Weise zu cachen?
Ich bin mit .Net 4.
http://stackoverflow.com/questions/854976/will-values-in-my-threadstatic-variables-still-be-there-when-cycled-via-threadpo –
Was ist das Ziel Ihres Cache? Möchtest du wirklich, dass jeder Thread eine eigene Kopie deines großen Objekts hat? Oder wollen Sie wirklich ein * einzelnes * großes Objekt mit allen Threads teilen, aber threadsicher? Wenn es Letzteres ist, sehen Sie sich die Klasse [Lazy] (https://msdn.microsoft.com/en-us/library/dd642331 (v = vs.110) .aspx) an. – sstan
@ststan Sie stellen die richtige Frage. Ich möchte nicht wirklich 250 Instanzen von großen Objekten haben. Die ideale Situation besteht darin, so wenige Instanzen wie die Anzahl der gleichzeitigen Threads zu haben, die zu einer bestimmten Zeit tatsächlich etwas an tempImages wie 8 Instanzen durchführen, die 8 Hyper-Threaded-Cores entsprechen. Lazy macht das nicht, weil es nicht um die Initialisierung geht. Die großen Objekte sind temporäre Bilder, die von DoSomething() bearbeitet werden, so dass eine einzelne Instanz hier nicht funktioniert. –