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

Korrekter Algorithmus für das Spiel von zwei Stapeln auf HackerRank

Ich habe gerade ein Stack-basiertes Problem mit HackerRank versucht Ссылка Alexa hat zwei Stapel nichtnegativer Ganzzahlen, Stapel A und Stapel B, wobei Index 0 die Oberseite des Stapels angibt. Alexa fordert Nick heraus, das folgende Sp...
20.05.2017, 08:41
3
Antworten

Ist die Reihenfolge der HashMap-Elemente reproduzierbar?

Zunächst möchte ich klarstellen, dass ich niemals eine HashMap verwenden würde, um Dinge zu tun, die eine gewisse Ordnung in der Datenstruktur erfordern und dass diese Frage von meiner Neugier auf die inneren Details der Java HashMap-Implementie...
02.04.2014, 13:28
1
Antwort

Effizienter Algorithmus zum Auffinden der gebräuchlichsten Ausdrücke in einem großen Textvolumen

Ich denke darüber nach, ein Programm zu schreiben, das mir die gebräuchlichsten Sätze in einem großen Teil des Textes sammelt. Wäre das Problem auf das bloße Finden von Wörtern reduziert worden, so wäre das so einfach wie das Speichern jedes neu...
27.10.2013, 18:49
2
Antworten

Datenstruktur für nicht überlappende Bereiche von ganzen Zahlen?

Ich erinnere mich, dass ich eine Datenstruktur gelernt habe, die ganze Zahlen als Bereiche in einem Baum gespeichert hat, aber es sind 10 Jahre vergangen und ich kann mich nicht mehr an den Namen der Datenstruktur erinnern, und ich bin ein wenig...
20.10.2013, 03:36
3
Antworten

effizienter Weg, um 2-Zeilen-Segmente zu behandeln

   Ich habe riesige 2D-Liniensegmente. Also, ich weiß es; Zeilennummer,   Beginne (X, Y, Z) und Ende (x, Y, Z) jedes Liniensegments. ich möchte bekommen   Näherungsliniensegmente für ein gegebenes Liniensegment. Ebenso für alle.       Um die Nä...
18.03.2013, 12:12
2
Antworten

Nachteil der steigenden Anzahl von Partitionen in Java ConcurrentHashMap?

Java ConcurrentHashMap verwaltet Partitionen intern. Jede Partition kann separat gesperrt werden. Es kann Szenarien geben, in denen alle Schlüssel, auf die mehrere Threads zugreifen, in dieselbe Partition fallen und Partitionen nicht hilfreich s...
21.06.2013, 11:16
1
Antwort

Variable Größe bitset [duplizieren]

Ich übe eine Frage über Arrays, in denen ich einzigartige Elemente finden muss. Nun ist es meine Logik, das maximale Element im Array zu finden und das Bitset dafür zu definieren. Aber Problem ist bitset braucht einen konstanten Wert, so wie d...
21.01.2013, 06:48
3
Antworten

Wie behalte ich eine große Warteschlange mit den wichtigsten Elementen?

In einem Optimierungsproblem halte ich viele Kandidatenlösungen in einer Warteschlange, die ich entsprechend ihrer Priorität untersuche. Jedes Mal, wenn ich einen Kandidaten behandle, wird er aus der Warteschlange entfernt, aber es erzeugt...
04.01.2011, 00:17
2
Antworten

Datenstruktur zum Verlegen von Polygonsegmenten in Haskell?

Ich habe eine ungeordnete Liste von horizontalen / vertikalen Segmenten der Länge 1, die ein oder mehrere Polygone bilden. Ich muss jetzt die Liste aller verbundenen Ecken in jedem Polygon finden. Beispiel: %Vor% steht für eine Zeile wie...
10.06.2011, 15:52
4
Antworten

Verknüpfte Liste mit anderen verknüpften Listen & frei

Ich habe eine generische Verkettungslistenimplementierung mit einer Knotenstruktur, die void * zu Daten enthält, und einer Listenstruktur, die einen Verweis auf head enthält. Jetzt ist hier mein Problem, dass ein Knoten in der verknüpften Liste...
10.02.2011, 01:13