Interlocked verwendet, um einen Boolean zu erhöhen / zu imitieren, ist das sicher?

8

Ich frage mich nur, ob dieser Code, den ein Mitentwickler (der inzwischen gegangen ist) in Ordnung ist, ich glaube, er wollte vermeiden, eine Sperre zu setzen. Gibt es einen Leistungsunterschied zwischen dieser und nur einer direkten Sperre?

%Vor%

Ich dachte, dass so etwas mit einem Schloss einfacher wäre? Es wird in der Tat von mehreren Threads verwendet, weshalb der Einsatz von Sperren / Verriegelungen entschieden wurde.

    
Sarah Fordington 07.09.2009, 13:27
quelle

2 Antworten

13

Ja, was Sie tun, ist vom Standpunkt der Rasse aus sicher, dass Sie das Feld m_LayoutSuspended erreichen. Aus folgenden Gründen ist jedoch eine Sperre erforderlich, wenn der Code Folgendes ausführt:

%Vor%

Eine sicherere Methode, die CompareExchange verwendet, um sicherzustellen, dass keine Racebedingungen aufgetreten sind:

%Vor%

Oder besser, verwenden Sie einfach eine Sperre.

    
Pop Catalin 07.09.2009 13:48
quelle
8

Persönlich würde ich einen flüchtigen booleschen verwenden:

%Vor%

Andererseits, wie ich kürzlich an anderer Stelle bestätigt habe, bedeutet volatil nicht, was ich dachte. Ich vermute, das ist okay, aber:)

Selbst wenn du bei Interlocked bleibst, würde ich es in ein int ändern ... es gibt keine Notwendigkeit, 32-Bit-Systemen Schwierigkeiten zu machen, einen 64-Bit-Schreib-Atomic zu machen, wenn sie es mit 32 leicht schaffen Bits ...

    
Jon Skeet 07.09.2009 13:31
quelle

Tags und Links