Ist C ++s neuer Operator reentrant (oder async-safe)?

8

Der Hintergrund ist in dieser Frage von mir. Kurz gesagt, ich muss fork in einem Multithread-C ++ - Programm haben, also würde ich gerne herausfinden, wie viel ich tun kann, wenn ich nur auf Wiedereintrittsfunktionen beschränkt bin, und eines der wichtigsten Dinge ist dynamischer Speicher.

Also ist malloc nicht einspringend . Aber was ist mit C ++ new ? Ich googelte dafür mit nicht vielen relevanten Ergebnissen (hauptsächlich wegen der Schwierigkeit, das richtige "neue" zu treffen), aber es gibt mindestens eine Behauptung, dass new ist reentrant . Es gibt auch eine relevante Frage für die gesamte C ++ - Standardbibliothek ohne zufriedenstellende Antwort.

Edit: Ich schätze, der Standard hat dazu nichts gesagt, daher mache ich mir hauptsächlich Sorgen über größere Implementierungen.

    
xiaq 30.12.2012, 12:08
quelle

3 Antworten

2

Ich habe sowohl die gcc libsupc ++ und clang angesehen. Quelle libc ++ zum Ersetzen der standardkonformen C ++ - Operatoren new / delete - um native SIMD zu unterstützen Ausrichtungsanforderungen auf Plattformen, auf denen dies nicht von malloc garantiert wurde.

Sie sind im Grunde Wrappers für malloc und free mit irgendeiner EH-Logik, etc. Ich bin kein Sprachanwalt, aber wenn beide nicht falsch liegen, denke ich, dass es sicher ist: Nein, sie sind nicht wiedereintretend.

    
Brett Hale 30.12.2012, 12:19
quelle
1

Fadensicherheit und Wiedereintritt sind nicht genau gleich.

AFAIK, der C ++ - ISO-Standard garantiert keine Thread-Sicherheit für die Operatoren new und delete . Aber g++ Implementierung bietet Thread-Safetly (und es ist einer der Gründe, warum es langsam ist).

    
Swapnil 30.12.2012 12:19
quelle
1

Standard erlaubt new nur einen Wrapper um malloc . Wenn also malloc nicht reentrant sein kann, dann kann new .

    
milleniumbug 30.12.2012 12:29
quelle

Tags und Links