data-structures

___ qstnhdr ___ Ist standardmäßig std :: vector threadsicher und gleichzeitig? Warum oder warum nicht? ___ qstntxt ___

Was bedeutet es, ein dynamisches Array threadsicher und gleichzeitig zu machen? Sagen Sie beispielsweise %code% .

  1. Zwei Threads möchten möglicherweise an der gleichen Position eingefügt werden. Es ist keine Synchronisation erforderlich, da dies gemäß der Thread-Planung durchgeführt wird.
  2. Ein Thread wird gelöscht und ein anderer greift auf dasselbe Element zu? Dies ist kein Problem mit der Datenstruktur. Ich glaube, es ist ein Nutzungsproblem.

Gibt es also etwas, das über %code% erledigt werden muss, um es threadsicher und gleichzeitig zu machen oder ist es threadsicher und gleichzeitig standardmäßig?

    
___ tag123datastrukturen ___ Eine Datenstruktur ist eine Möglichkeit, Daten so zu organisieren, dass bestimmte Eigenschaften dieser Daten effizient abgefragt und / oder aktualisiert werden können. ___ tag123concurrency ___ In der Informatik ist Nebenläufigkeit eine Eigenschaft von Systemen, in denen mehrere Berechnungen in überlappenden Zeiträumen durchgeführt werden können. Die Berechnungen können auf mehreren Kernen in demselben Chip, präemptiv zeitgeteilten Threads auf demselben Prozessor oder auf physikalisch getrennten Prozessoren ausgeführt werden. ___ tag123vector ___ Ein Vektor ist ein eindimensionales Array: Er enthält Komponenten, auf die mit einem ganzzahligen Index zugegriffen werden kann. In einigen Sprachen kann die Größe eines Vektors nach Bedarf vergrößert oder verkleinert werden, um Elemente hinzuzufügen und zu entfernen, nachdem der Vektor erstellt wurde. Verwenden Sie "Vektorgrafiken" für die grafische Darstellung. ___ answer31132250 ___

Die einzigen gleichzeitigen Operationen für ein einzelnes Objekt in der Standardbibliothek, die standardmäßig sicher sind, sind  - Nur Zugriff auf %code% -Member Funktionen  - Alle Zugriffe auf Synchronisationsprimitive (wie Mutex Lock und Unlock oder atomare Operationen) Alles andere muss extern synchronisiert werden. Insbesondere hat die Standardbibliothek noch keine threadsicheren Container (ab c ++ 14)

Die Antwort auf beide Beispiele ist also nein, beide erfordern eine Form der externen Synchronisation.

Sie können natürlich den Wert zweier verschiedener Elemente im Container ändern.

    
___ tag123lockfree ___ Ein Oberbegriff für Methoden und Algorithmen zum Synchronisieren von Multithread-Umgebungen oder anderen Formen verteilter Systeme ohne Verwendung von Sperren. ___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ answer31131915 ___

C ++ 11 sagt Folgendes über die Thread-Sicherheit von Containern in der Standardbibliothek:

  

23.2.2 Containerdatenrassen [container.requirements.dataraces]

     

Zum Zweck der Vermeidung von Datenrennen (17.6.5.9) müssen Implementierungen   Betrachte die folgenden Funktionen als const: %code% , %code% ,    %code% , %code% , %code% , %code% , %code% , %code% , %code% ,    %code% , %code% , %code% und, außer in assoziativen oder   ungeordnete assoziative Container, %code% .

     

Ungeachtet (17.6.5.9) sind Implementierungen erforderlich, um Daten zu vermeiden   Rennen, wenn der Inhalt des enthaltenen Objekts in verschiedenen Elementen   in der gleichen Reihenfolge, mit Ausnahme von %code% , werden geändert   gleichzeitig.

Das Lesen von einem Container aus mehreren Threads ist also in Ordnung, und das Modifizieren von Elementen, die sich bereits im Container befinden, ist in Ordnung (solange sie verschiedene Elemente sind).

Daher ist keine der beiden spezifischeren Fragen für %code% threadsicher:

1) Zwei Threads, die in den Vektor eingefügt werden, modifizieren den Vektor selbst - keine existierenden separaten Elemente.

2) Das Löschen eines Threads und anderes Gehen, um auf dasselbe Element zuzugreifen, ist nicht sicher, da das Löschen eines Elements aus dem Vektor keine Operation ist, die threadsicher ist (oder "frei von Datenrennen" wie der Standard) setzt es).

Um diese Operationen sicher ausführen zu können, muss das Programm eine externe Synchronisation selbst vornehmen.

    
___
3
Antworten

Arrays als separater Typ

Einige Skriptsprachen wie Python und Javascript haben Arrays (auch Listen genannt) als separate Datentypen aus Hashtabellen (auch Wörterbücher, Karten, Objekte). In anderen Skriptsprachen wie PHP und Lua ist ein Array lediglich eine Hash-Tabelle...
03.07.2011, 18:29
3
Antworten

Zeigerzyklen in clojure

Ich schreibe ein Clojure-Programm, das XML analysiert. Als Teil davon möchte ich einen Baum der Knoten im XML-Dokument basierend auf der clojure.xml / parse-Funktion erstellen. Ich möchte jedoch, dass der Baum bidirektional ist - das heißt, jede...
14.02.2012, 10:41
2
Antworten

Datenstruktur, um Ganzzahlen innerhalb eines Abfragebereichs effizient zu finden

Es gibt eine beliebige Anzahl von verschiedenen vorzeichenlosen Ganzzahlwerten innerhalb eines bekannten Bereichs . Die Anzahl der ganzzahligen Werte ist & lt; & lt; die Anzahl der ganzen Zahlen innerhalb des Bereichs. Ich möchte eine...
08.12.2011, 15:42
4
Antworten

Programmierung für Schnittstellen und synchronisierte Sammlungen

Diese Frage bezieht sich auf Java-Sammlungen - insbesondere auf Hashtable und Vector -, kann sich aber auch anderswo bewerben. Ich habe an vielen Stellen gelesen, wie gut es ist, Schnittstellen zu programmieren, und ich stimme zu 100% zu. Die...
19.10.2009, 21:24
4
Antworten

O (1) Suche in nicht zusammenhängendem Speicher?

Gibt es eine bekannte Datenstruktur, die O (1) wahlfreien Zugriff ermöglicht, ohne einen zusammenhängenden Speicherblock der Größe O (N) oder größer zu verwenden? Dies wurde von dieser Antwort inspiriert und wird um Neugier gebeten eher als fü...
20.01.2010, 01:31
5
Antworten

Effektive Datenstruktur für überlappende räumliche Bereiche

Ich schreibe ein Spiel, in dem eine große Anzahl von Objekten "Flächeneffekte" über einer Region einer gekachelten 2D-Karte haben. Erforderliche Funktionen: Mehrere dieser Flächeneffekte können sich überlappen und sich auf dieselbe Kachel...
28.06.2010, 19:58
1
Antwort

Vorgehensweise beim Animieren von Zwischenzuständen, wenn das Modell diskret ist

Das Datenmodell in meinem Programm hat eine Anzahl von diskreten Zuständen, aber ich möchte den Übergang zwischen diesen Zuständen animieren. Während der Animation wird das, was der Benutzer auf dem Bildschirm sieht, von den zugrunde liegenden D...
03.07.2009, 11:15
4
Antworten

C ++ - Strukturinitialisierung

Das Folgende ist eine gekürzte Version meiner Sprite-Klasse: %Vor% Ich möchte ein SpriteState-Objekt über eine Elementfunktion erstellen, die in etwa wie folgt aussieht: %Vor% Ich erhalte den folgenden Fehler:    Eine nicht statische...
19.12.2012, 11:03
2
Antworten

Ist es eine schlechte Übung, verschachtelte HashMaps zu verwenden?

Lassen Sie mich mein Szenario erklären. Ich habe eine Hierarchie, die ich beibehalten muss. Unten finden Sie ein Bild, das diese Hierarchie zeigt. Ich werde nach dem Bild erklären. %Vor% Von A bis A1, A2... ist es eine one to many B...
23.03.2014, 06:55
4
Antworten

Vergleich zweier Graphen

Ich muss viele Graphen vergleichen (bis zu einigen Millionen Graphenvergleichen) und ich frage mich, was der schnellste Weg ist. Die Scheitelpunkte von Graphen können bis zu 8 Nachbarn / Kanten haben und der Scheitelpunkt kann den Wert 0 oder...
04.04.2013, 18:49