In einem Multithread-Programm, das auf einem Multi-CPU-Rechner ausgeführt wird, muss ich mit volatilen Lese-/Schreibzugriff auf den freigegebenen Status (_data im folgenden Beispielcode) zugreifen um die Richtigkeit zu gewährleisten.Verwendung von volatile (Thread.VolatileRead/Thread.VolatileWrite) in C#
Mit anderen Worten, können Heap-Objekte auf der CPU zwischengespeichert werden?
Mithilfe des unten stehenden Beispiels und unter der Annahme, dass Multi-Threads auf die GetValue- und Add-Methoden zugreifen, muss ThreadA Daten hinzufügen (mithilfe der Add-Methode) und ThreadB, um die hinzugefügten Daten sofort anzeigen zu können (Verwenden der GetValue-Methode). Muss ich flüchtige Lese-/Schreibvorgänge zu _data hinzufügen, um dies sicherzustellen? Im Grunde möchte ich keine Daten hinzufügen, die auf der CPU von ThreadA zwischengespeichert werden.
/Ich bin nicht Sperren (Durchsetzung exklusiven Thread-Zugriff) als der Code muss ultra-schnell sein und ich bin keine Daten aus _data entfernen, so dass ich _data nicht sperren müssen.
Danke.
**** aktualisieren ****************************
Offensichtlich ihr denken gehen Lock-frei mit Dieses Beispiel ist eine schlechte Idee. Aber welchen Nebenwirkungen oder Ausnahmen könnte ich hier begegnen?
Kann der Dictionary-Typ eine Ausnahme auslösen, wenn 1 Thread die Werte zum Lesen iteriert und ein anderer Thread die Werte für die Aktualisierung iteriert? Oder würde ich nur "Dirty Reads" erleben (was in meinem Fall in Ordnung wäre)?
**** End-Update ****************************
public sealed class Data
{
private volatile readonly Dictionary<string, double> _data = new Dictionary<string, double>();
public double GetVaule(string key)
{
double value;
if (!_data.TryGetValue(key, out value))
{
throw new ArgumentException(string.Format("Key {0} does not exist.", key));
}
return value;
}
public void Add(string key, double value)
{
_data.Add(key, value);
}
public void Clear()
{
_data.Clear();
}
}
Vielen Dank für die Antworten. Was die Sperren anbelangt, so werden die Methoden ziemlich oft von mehreren Threads aufgerufen, sodass mein Problem bei umkämpften Sperren nicht die eigentliche Sperroperation ist.
Also ist meine Frage über CPU-Caching, kann Heap-Objekte (die _Data Instanz Feld) auf einer CPU zwischengespeichert werden? Benötige ich den Zugriff auf das Feld _data mit volatilen Lese-/Schreibvorgängen?
/Auch ich bin mit .Net 2.0 stecken.
Danke für Ihre Hilfe.