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

Finden von Paaren mit kleinsten XOR-Werten aus einer Liste

Ich arbeite an einem Problem, bei dem von mir erwartet wird, dass ich den xor von nehme das ganze Paar von ganzen Zahlen in einem Array und dann finden Sie das kleinste K Ganzzahlen aus Xor'ing. Die Größe des Arrays kann N = 100000 sein und so k...
01.03.2012, 21:59
5
Antworten

Datenstruktur für die Implementierung von Tabellenkalkulationen

Welche Datenstruktur wird von Tabellenkalkulationsprogrammen wie ms-excel verwendet?     
08.02.2009, 17:47
3
Antworten

Bewährte Methode zum Speichern großer Dateilisten in Java

Ich schreibe ein kleines System in Java, in dem ich ein N-Gramm-Feature aus Textdateien extrahiere und später einen Feature-Selection-Prozess durchführen muss, um die meisten Diskriminator-Features auszuwählen. Der Feature Extraction-Prozess...
14.01.2015, 13:17
5
Antworten

Entwurf einer leistungsfähigen sortierten Datenstruktur, die von vielen Threads gelesen und von wenigen geschrieben wird

Ich habe ein interessantes Datenstruktur-Design-Problem, das über meine derzeitige Expertise hinausgeht. Ich suche Datenstruktur oder Algorithmus Antworten zur Bewältigung dieses Problems. Die Anforderungen: Speichern Sie eine sinnvolle A...
28.11.2013, 13:29
3
Antworten

ein Array von Strings gegeben, return true, wenn jede Zeichenfolge miteinander verbunden werden könnten

Sie erhalten ein Array von Strings und geben true zurück, wenn und nur wenn alle Strings in einer Kette verbunden werden können. Bedingung für Konnektivität ist, wenn das letzte Zeichen einer Zeichenfolge mit dem ersten Zeichen der zweiten Z...
17.07.2013, 17:13
1
Antwort

Wie funktionieren Inits und Tails in Data.Sequence?

Louis Wasserman hat die aktuellen Implementierungen von inits und tails in Data.Sequence geschrieben. Er weist darauf hin, dass sie sehr effizient sind, und wenn man sich den Code anschaut, kann ich sehen, dass alles, was sie tun, saube...
06.03.2015, 20:05
1
Antwort

Warum berücksichtigt der gewichtete Quick Union-Algorithmus die Größe des Baums statt ihrer Höhe?

Ich habe Robert Sedgewicks Video über Verbesserungen der schnellen Union angeschaut. ( Ссылка ) Dort verwendet er die Größe des Baumes und nicht die Höhe. Das Problem besteht eigentlich darin, den Wurzelknoten zu finden. Das Finden wird schwi...
20.06.2015, 18:46
7
Antworten

"Atomic" aktualisiert ein ganzes Array

Ich habe einen einzelnen Schreiber-Thread und einen einzigen Leser-Thread, um einen Pool von Arrays zu aktualisieren und zu verarbeiten (Referenzen, die in der Map gespeichert sind). Das Verhältnis der zu lesenden Schreibvorgänge beträgt fast 5:...
15.03.2013, 23:51
3
Antworten

Max in O (1) löschen und in O (logn) einfügen

Entwickeln Sie eine Datenstruktur, die die folgenden Operationen für ein n-Element-Set unterstützt: Einfügen in Zeit O(lg n) Löschen Sie das Maximum in O(1) time. Beachten Sie, dass delete max in einem konventionellen Heap O(lg n)...
05.03.2013, 13:24
5
Antworten

Suche nach spezieller C ++ - Datenstruktur

Ich suche nach einer C ++ - Implementierung einer Datenstruktur (oder einer Kombination von Datenstrukturen), die die folgenden Kriterien erfüllen: Auf Elemente wird wie in std :: vector zugegriffen bietet einen Direktzugriffs-Iterator (...
10.08.2011, 12:13