2014-10-15 8 views
9

Ich bin sicher, dass in der Praxis die Verwendung von ::new Thread-sicher ist. Meine Frage ist, welcher Teil des Standards diese Garantie bietet, wenn überhaupt? Ist das eine Konvention? Ist das etwas, wo der Standard Implementierungen eine Menge Spielraum gibt (wie die relativ lockeren Beschränkungen bezüglich der Größe jedes Datentyps), um eine große Vielzahl von Hardware zu unterstützen?Gewindesicherheit von :: neu in C++ 11

Ich hoffe, dass es irgendwo im C++ 11-Standard irgendwo eine Zeile gibt, die explizit angibt, dass "Implementierungen von ::new threadsicher sein müssen".

Ich würde auch gerne einige Standard über die Thread-Sicherheit der Betreiber neue Überlastungen zu sehen. Ich stelle mir vor, dass sie auch sein müssen Thread-sicher sein, aber diese Funktionen fallen auch nicht unter die Decke Garantie, dass const => thread sicher (in C++ 11).

Danke!

+0

Warum sollte der Standard Ihnen garantieren, dass Ihre "neue" Überlastung threadsicher ist? Dein Programm, deine Probleme. – MSalters

+0

@MSalters - Aus dem gleichen Grund, dass es const => thread-safe macht. Denn ohne diese Garantie auch in Ihrem Code zu gewährleisten, können Sie nicht sicher mit der Standardbibliothek interagieren. Kannst du dich in den Fuß schießen? Ja, genau wie alles in C++ ... aber das ist kaum der Punkt. – Mark

Antwort

9

Ich glaube, das ist implizit durch den C++ 11-Standard garantiert. Wenn dies nicht der Fall wäre, könnte die Verwendung des neuen oder neuen Ausdrucks des Operators zu einem Datenrennen führen, und dies wäre vom Standard nicht erlaubt. Als Referenz finden §17.6.5.9 Daten Rennen Vermeidung und auch

18.6.1.4 Daten Rennen [new.delete.dataraces]

„Die Bibliothek Versionen von operator new und Betreiber löschen, Benutzer Ersatz Versionen des globalen Operators new und des Operators delete, und die C-Standardbibliotheksfunktionen calloc, malloc, realloc und free dürfen keine Datenrennen (1.10) als Ergebnis von gleichzeitigen Aufrufen von verschiedenen Threads einführen Aufrufe an diese Funktionen, die a zuweisen oder freigeben Eine bestimmte Speichereinheit muss in einer einzigen Gesamtbestellung auftreten, und jede solche Freigabe muss vor der nächsten Zuteilung (falls vorhanden) in dieser Reihenfolge erfolgen. "

Ihre eigenen Überschreibungen oder Ihre eigenen Ersetzungen für die globalen Operatoren sollten auch diese Anforderung erfüllen.

Siehe auch diese proposal N3664 "Clarifying Memory Allocation", die mehr Gewicht auf diese Angelegenheit legt.

2

Der C++ - Standard erfordert nicht unbedingt, dass new Thread-sicher sein. Einige Implementierungen unterstützen explizit die Erstellung von C++ - Code im Singlethread-Modus, in dem die C-Standardbibliothek einschließlich mallloc() möglicherweise nicht Thread-sicher ist. Die Plattformen, die die meisten von uns täglich nutzen, bieten natürlich eine thread-sichere Zuordnung.

Auch wenn Ihre Plattform einen Thread-sicheren new bietet, müssen Sie immer noch vorsichtig sein, wenn Sie Bibliotheken verwenden, die ihre eigenen operator new implementieren, oder wenn Sie dies selbst tun. Es ist sicherlich möglich, eine new zu schreiben, die nur in einem einzigen Thread funktioniert - vielleicht sogar absichtlich!