2016-06-16 5 views
2

Ich habe eine std::vector<std::atomic_bool>, die ich auf einige beliebige n Größe ändern möchte, wobei alle neu erstellten Objekte einen Wert von True zugewiesen werden. Das Programm wird nicht erstellt, da resize() auf den Kopierkonstruktor des Datentyps und nicht auf seinen Zuweisungsoperator angewiesen ist. Gibt es eine Möglichkeit, einem atomic_bool einen Standardwert zuzuordnen oder würde ich mit einer Schleife und store() alle Werte festhalten?Ändern der Größe eines std :: vector <std :: atomic_bool> Zuweisen zu allen atomaren Bools

Was ich habe versucht:

#include <atomic> 
#include <vector> 

class foo() { 
public: 
    std::vector<std::atomic_bool> vec; 

    foo() { 
     std::atomic_bool temp(true); 

     vec.resize(100, std::atomic_bool(true)); //try 1 

     vec.resize(100, temp); //try 2 
    } 
} 
+4

Es macht nicht Sinn, atomare Typen in einen Vektor zu stecken. Atomtypen sind so angelegt, dass mehrere Threads darauf zugreifen können, und das scheint nicht sinnvoll zu sein, wenn die Elemente verschoben werden können. Wenn Sie keine Neuzuweisung wünschen, erstellen Sie einfach den Vektor mit der Größe 100 von Anfang an ([Demo] (http://melpon.org/wandbox/permlink/UHlG7obdmMgsfxx)). –

+0

@KerrekSB Ich denke, es ist in Ordnung. Sie können Vektor aus mehreren Threads lesen, solange kein Thread versucht, den Vektor zu ändern. –

+0

@ BryanChen; Sicher, das kannst du, aber es ergibt keinen Sinn. Dafür gibt es keinen Anwendungsfall. –

Antwort

7

Wenn T weder kopierbar noch beweglich ist, dann std::vector<T> kann nicht geändert werden. Zeitraum. In diesem Fall möchten Sie vielleicht std::deque in Betracht ziehen.

std::deque<std::atomic_bool> D; 
D.emplace_back(true); // write a helper to do this 100 times if you want 

Beachten Sie jedoch, dass ein Standard-Bibliothekscontainer von atomics nicht atomar ist; Das Hinzufügen neuer Elemente zum Container ist keine atomare Operation, daher müssen Sie den Container wahrscheinlich mit einem Mutex schützen, wodurch die Vorteile des Speicherns von Atomics eliminiert werden.

-2

atomics nicht bewegt werden entworfen, so dass Sie sie neu zuteilen kann nicht woanders sein. Sie können sie jedoch ersetzen.

vec = std::vector<std::atomic_bool>(100, true); 

(Ich bin nicht 100% sicher, dass Sie true hier verwenden können, aber ich glaube, Sie können.)

0

Brians Vorschlag einer deque ist Sound und erlaubt immer noch O (1) wahlfreien Zugriff, obwohl ich erwarten würde, dass es ein paar Mal langsamer als ein vector ist. Kerreks Vorschlag einer höheren Klassenklasse, die eine vector verwaltet, ist ebenfalls praktikabel.

FWIW, eine weitere Option ist Umwickeln der einzelnen std::atomic_bool s mit einem Typ, der Kopie Aufbau als eine Kombination aus Standard-Aufbau und Zuordnung orchestriert:

struct Copy_Constructible_Atomic_Bool : std::atomic_bool 
{ 
    Copy_Constructible_Atomic_Bool(const std::atomic_bool& rhs) 
    { 
     std::atomic_bool::operator=(rhs); 
    } 

    Copy_Constructible_Atomic_Bool(const Copy_Constructible_Atomic_Bool& rhs) 
    { 
     std::atomic_bool::operator=(rhs); 
    } 
}; 

Verbrauch:

std::vector<Copy_Constructible_Atomic_Bool> vec; 
std::atomic_bool temp; 
temp = true; 
vec.resize(100, temp); 
Verwandte Themen