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.

    
___
1
Antwort

Ersetzen Sie die Vektor- und Hash-Tabelle durch Boost.Bimap

Ich möchte eine vector<string> - und eine boost::unordered_map<string, size_t> - Zuordnungszeichenfolge in Indizes mit einer boost::bimap ersetzen. Welche Instanz von bimap soll ich verwenden? Bisher habe ich mich mit...
16.11.2010, 13:12
1
Antwort

Effizienteste Datenstruktur zum Hinzufügen von Stilen zu Text

Ich suche nach der besten Datenstruktur, um einem Text Stile hinzuzufügen (etwa in einem Texteditor). Die Struktur sollte die folgenden Operationen ermöglichen: Schnelles Nachschlagen aller Stile an der absoluten Position X Schnelles Einfü...
15.11.2010, 15:03
1
Antwort

Phoenix 1.3 (Elixir) Fehler: Myapp.Users.User .__ struct __ / 0 ist nicht definiert, kann die Struktur Myapp.Users.User nicht erweitern

Versuchen Sie, eine API mit Phoenix v1.3 nach diesem Tutorial zu erstellen: Ссылка ( hat darauf geachtet, dass jeder Schritt dem Buchstaben folgt) Wenn ich versuche, mix ecto.setup auszuführen Ich erhalte den folgenden Fehler:...
06.06.2017, 21:14
4
Antworten

Was ist der Unterschied zwischen einem "Container" und einer "Datenstruktur"?

Was ist ein Container? So wie ich es verstehe: Ein abstrakter Datentyp ist lediglich eine logische Beschreibung der Art und Weise, wie die Daten gespeichert werden und welche Operationen für diese Daten zulässig sind. Zum Beispiel wird ein...
27.06.2012, 01:15
1
Antwort

Wie speichert Neo4j Daten intern?

Meine Frage stammt aus der Sicht des Entwicklers (nicht speziell im Hinblick auf den Benutzer) und kann etwas unordentlich sein. Ich möchte wissen, wie die Struktur von Knoten und Beziehungen in der Datenbank logisch gespeichert wird. Zum Beispi...
23.06.2014, 12:34
1
Antwort

Wie finde ich die Unterschiede zwischen zwei fast identischen Dateien sehr schnell?

Wenn Sie zwei weitgehend identische Dateien mit mehreren tausend Datensätzen haben, wie schreiben Sie Code, um Unterschiede zwischen ihnen zu finden. Angenommen, Unix / Linux-Befehle dürfen nicht verwendet werden. Meine Idee: Da die meiste...
27.10.2011, 04:48
4
Antworten

Datenstruktur für das Double Elimination Turnier

Ich bin dabei, meine Tournament Organizer-Software, die das Erstellen und Bearbeiten von Double Elimination Turnieren ermöglicht, in das MVVM-Designmuster zu konvertieren, damit es einfacher getestet werden kann. Dadurch entkomme ich das "Modell...
26.02.2009, 09:46
4
Antworten

Häufigstes Element in einem Array / Die relative Mehrheit, deterministisch in O (n) Zeit und O (1) Raum finden?

So zum Beispiel die Antwort für das Array: 1, 11, 3, 95, 23, 8, 1 wäre 1, da alle anderen Elemente nur einmal vorkommen, während 1 zweimal auftritt. Viele der ähnlichen Fragen, die ich bei stackoverflow gesehen habe, fragen nach der abs...
02.08.2012, 16:18
1
Antwort

Gibt es ein JavaScript-Äquivalent zur Multimap-Datenstruktur? [geschlossen]

Multimap ist eine Datenstruktur, die einen Schlüssel einer Liste / Menge von Werten zuordnet. Gibt es eine gute, unauffällige js-Bibliothek, die diese Datenstruktur implementiert? Bearbeiten - Ich weiß, dass ich es "einfach" selbst imp...
04.07.2012, 12:36
3
Antworten

Entfernen Sie die Duplikate aus dem Baum

Ich habe die Klasse: %Vor% Um einen Knoten in einem Baum darzustellen. Nun möchte ich die doppelten Knoten aus einem Baum entfernen. Nimm zum Beispiel den Baum: Hinweis: grün Foo! = lila Foo Welcher Algorithmus ermöglicht es mir...
28.08.2012, 14:38