Frage

Ich habe gerade gelernt, dass in der Sprache C malloc Funktion mit der Frage der Thread-Konkurrenz kommt, wenn in einer Multi-Threaded-Anwendungen verwendet wird.

In C ++ ist operator new aus dem gleichen Problem leiden? Falls ja, wie tecnhique kann ich diese das klingt wie eine große Strafe in der Anwendungsleistung zu vermeiden?

War es hilfreich?

Lösung

Das „Problem“ der Thread-Konkurrenz hängt wirklich von der Implementierung. Einige der Implementierungen von malloc im allgemeinen Gebrauch waren ursprünglich nicht mit Multithreading im Auge behalten. Aber eine malloc-Implementierung für Multi-Thread-Anwendungen sollten nicht von Konkurrenz unter normalen Umständen leiden.

Als Beispiel für eine malloc Implementierung entwickelt, um mit Multithreading im Auge, Blick auf jemalloc .

Andere Tipps

In Abhängigkeit von den Implementierungen von neuen, aber da es in der Regel malloc ist ja basierte. Hier einige Sache, die Sie tun können:

  • einen Profiler Verwenden Sie die Anzahl der Anrufe an malloc() (und vielleicht brk()) zu zählen pro Sekunde, stellen Sie sicher, dass Sie ein Konkurrenzproblem mit malloc().
  • Versuchen Sie, die Arbeit mit einem parallelen Speicherzuordner (dh. horten )
  • Verwenden Sie den Stapel, wenn es möglich ist: rufen Sie nicht neu, wenn Sie nicht benötigen. Denken Sie auch daran, dass kleine Kopien sind in der Regel mehr Cache freundlicher als Zeiger und Daten zwischen Threads gemeinsam genutzt.
  

In C ++ ist Betreiber neu unter dem gleichen Problem leiden?

Ja, in den meisten Implementierungen, tut es.

Wenn Sie in C ++ bereits, Threading Building Blocks ist eine C ++ Template-Bibliothek, die sollte passen Deine Bedürfnisse. Es verfügt über skalierbare Verteilern, Datenstrukturen, eine Website und mehr ...

Das Problem mit Thread-Konkurrenz in malloc kommt einfach nach unten, dass der Haufen durch eine Mutex von einem ähnlichen Gerät geschützt werden muß, wenn es aktualisiert wird. Wenn zwei Threads den Heap aktualisieren gleichzeitig erhalten Sie eine Race-Bedingung haben. Das gleiche Problem auf neues gilt, so gibt es keinen fundamentalen Grund, warum man weniger Streit als die nächsten haben sollte.

Having said that, gibt es eine Reihe von Tricks, Konflikte zu minimieren. Die erste ist die Halde zu brechen in einzelne Arenas. Jede Arena verfügt über ein eigenes Schloss. Wenn ein Thread versucht, Speicher zuzuweisen und die eine Arena ist gesperrt, es versucht, nur die nächste Arena zuzuteilen aus.

Frees müssen die gleiche Arena zuzugreifen, die für eine malloc verwendet wurde. Dies kann auch den Zeiger von Ort optimiert werden auf eine freie Liste befreit werden. Dies kann atomar erfolgen. Als nächstes die Arena entriegelt wird, alle Zeiger auf der freien Liste wird ordnungsgemäß freigegeben erhalten.

verhindern Diese Techniken helfen, aber nicht beseitigen Behauptung, die Mittel in einem Erzeuger Verbraucher Threading-Modell, Sie besser sein können die Verbraucher Pass Zeiger auf den Hersteller aus, die zurück, wo sie gegebenenfalls wiederverwendet oder gelöscht werden können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top