new
und delete
sind threadsicher
Die folgenden Funktionen müssen Thread-sicher sein:
- Die Bibliotheksversionen von
operator new
undoperator delete
- Benutzerersatzversionen des globalen
operator new
undoperator delete
std::calloc
,std::malloc
,std::realloc
,std::aligned_alloc
,std::free
Aufrufe an diese Funktionen, die eine bestimmte Speichereinheit zuordnen oder freigeben, erfolgen in einer einzigen Gesamtreihenfolge, und jeder dieser Zuordnungsaufrufe erfolgt vor der nächsten Zuordnung (falls vorhanden) in dieser Reihenfolge.
Mit gcc, new
wird durch Delegierung an malloc
implementiert , und wir sehen, dass ihr malloc
verwendet tatsächlich eine Sperre. Wenn Sie befürchten, dass Ihre Zuordnung Engpässe verursacht, schreiben Sie Ihren eigenen Allocator.
Die Antwort ist ja, aber in der Praxis ist es normalerweise kein Problem. Wenn es ein Problem für Sie ist, können Sie versuchen, Ihre Implementierung von malloc durch tcmalloc zu ersetzen, das mögliche Konflikte reduziert, aber nicht beseitigt (da es nur einen Heap gibt, der von Threads und Prozessen gemeinsam genutzt werden muss). P>
TCMalloc weist jedem Thread einen Thread-lokalen Cache zu. Kleine Zuordnungen werden aus dem Thread-Local-Cache befriedigt. Objekte werden nach Bedarf von zentralen Datenstrukturen in einen Thread-lokalen Cache verschoben, und regelmäßige Speicherbereinigungen werden verwendet, um Speicher aus einem Thread-lokalen Cache zurück in die zentralen Datenstrukturen zu migrieren.
Es gibt auch andere Optionen wie die Verwendung benutzerdefinierter Allokatoren und/oder spezialisierter Container und/oder die Neugestaltung Ihrer Anwendung.