2016-07-04 10 views
0

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.

+1

http://stackoverflow.com/questions/854976/will-values-in-my-threadstatic-variables-still-be-there-when-cycled-via-threadpo –

+0

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

+0

@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. –

Antwort

2

Thema lokale Variablen mit dem TPL oder mit dem Thread-Pool nicht kooperieren. Sie sind Thread -based. Wenn eine TPL-Bibliotheksfunktion einen Thread wiederverwendet, werden Ihre Thread-Locals wiederverwendet.

Mit einer Design-Perspektive denken Sie, diese Art von Caching wäre eine gute Entscheidung oder es gibt bessere Strategien, um große Objekte in einer Thread-sicheren Weise zu cachen?

Wenn Ihre Cache-Elemente unveränderlich sind, sind keine lokalen Thread-Elemente erforderlich. Verwenden Sie einen globalen Cache.

+0

Sie Objekte sind nicht unveränderlich, sie werden in DoSomething manipuliert, so dass separate Instanzen vorhanden sein sollten –

+0

Vielleicht können Sie einen ObjectPool verwenden, wo Threads kooperativ auschecken und Instanzen zurückgeben? – usr

+0

Scheint die einzig vernünftige Lösung. Ich hoffte, dass etwas weniger Kompliziertes verfügbar wäre –

Verwandte Themen