2014-02-13 11 views
13

Klasse atomic enthält atomic versions of many different variable types. Es enthält jedoch keinen atomaren Enum-Typ. Gibt es eine Möglichkeit, atomare Enums zu verwenden oder eigene zu erstellen? Soweit ich das beurteilen kann, besteht meine einzige Option darin, entweder keine Enums zu verwenden oder Mutexe/Semaphore zu verwenden, um sie zu schützen.Wie kann ich in C++ eine atomare Enumeration erstellen?

Hinweis: Diese bug report Ich habe erwähnt "std :: atomic enum support", aber ich sehe keine Erwähnung eines atomaren enum-Typs in der C++ - Standard, also bin ich mir nicht sicher, was das bedeutet.

+0

Der Fehlerbericht Sie sich recht ordentlich löscht verknüpft, I denken: "verwenden Sie nicht' ' vor gcc Version 4.7" –

Antwort

7

Sie können eine atomare Enumeration wie folgt erstellen:

#include <atomic> 

enum Decision {stay,flee,dance}; 
std::atomic<Decision> emma_choice {stay}; // emma_choice is atomic 

Sie können auch mit Enum-Klassen das gleiche tun:

#include <atomic> 

enum class Decision {stay,flee,dance}; 
std::atomic<Decision> emma_choice {Decision::stay}; // emma_choice is atomic 
+0

Interessant, da ich das Äquivalent von 'emma_choice = Decision :: stay' hatte und es fehlschlagen würde. Das Ändern mit 'emma_choice {Decision :: stay}' hat es kompiliert. –

17

Die allgemeine atomic Vorlage kann für all trivialen kopierbar-Typen, einschließlich Aufzählungen verwendet werden. Ob es frei von Sperren ist oder nicht, hängt von der Implementierung ab. hoffentlich wird es sein, wenn der zugrunde liegende Integer Typ ist.

+6

... und man kann überprüfen, so dass mit [is_lock_free()] (http://en.cppreference.com/w/cpp/atomic/atomic/is_lock_free) – stefan

Verwandte Themen