Ist die malloc()
Funktion wieder verfügbar?
c
multithreading
thread-safety
malloc
Alphaneo
quelle
quelle
Antworten:
Ich habe irgendwo gelesen, dass malloc threadsicher wird, wenn Sie mit -pthread kompilieren. Ich bin mir ziemlich sicher, dass die Implementierung davon abhängt, da malloc ANSI C ist und Threads nicht.
Wenn wir über gcc sprechen:
http://groups.google.com/group/comp.lang.c.moderated/browse_thread/thread/2431a99b9bdcef11/ea800579e40f7fa4
Eine andere Meinung, aufschlussreicher
http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2005-07/0323.html
quelle
-pthreads
den Malloc-Thread nicht automatisch sicher macht. Wenn Sie malloc in einem Signalhandler aufrufen, können alle Arten von verrücktem Unsinn passieren.Frage: "Ist Malloc wiedereintrittsfähig?"
Antwort: Nein, das ist es nicht. Hier ist eine Definition dessen, was einen routinemäßigen Wiedereintritt ausmacht .
In keiner der gängigen Versionen von malloc können Sie es erneut eingeben (z. B. von einem Signalhandler). Beachten Sie, dass eine Wiedereintrittsroutine möglicherweise keine Sperren verwendet und fast alle existierenden Malloc-Versionen Sperren (wodurch sie threadsicher sind) oder globale / statische Variablen (wodurch sie threadsicher und nicht wiedereintrittsfähig sind) verwenden.
Alle bisherigen Antworten antworten auf "Ist Malloc-Thread-sicher?", Was eine ganz andere Frage ist. Um diese Frage , die Antwort ist es hängt auf Ihrer Laufzeitbibliothek und möglicherweise auf dem Compiler - Flags , die Sie verwenden. Unter jedem modernen UNIX erhalten Sie standardmäßig ein thread-sicheres Malloc. Unter Windows verwenden
/MT
,/MTd
,/MD
oder/MDd
Fahnen Thread-sichere Laufzeitbibliothek zu erhalten.quelle
Dies ist eine ziemlich alte Frage, und ich möchte dem aktuellen Stand der Dinge Frische verleihen.
Ja, ist derzeit
malloc()
threadsicher.Aus dem GNU C Library Referenzhandbuch von
glibc-2.20 [released 2014-09-07]
:quelle
Hier ist ein Auszug aus malloc.c von glibc:
Thread-Sicherheit: Thread-sicher, sofern nicht NO_THREADS definiert ist
Unter der Annahme, dass NO_THREADS nicht standardmäßig definiert ist, ist malloc zumindest unter Linux threadsicher.
quelle
Ja, unter POSIX.1-2008
malloc
ist threadsicher.quelle
Wenn Sie mit GLIBC arbeiten, lautet die Antwort: Ja, ABER.
Insbesondere, ja, ABER, bitte, bitte beachten Sie, dass malloc und free zwar threadsicher sind, die Debugging-Funktionen jedoch nicht.
Insbesondere sind die äußerst nützlichen Funktionen mtrace (), mcheck () und mprobe () nicht threadsicher . In einer der kürzesten und direktesten Antworten, die Sie jemals von einem GNU-Projekt erhalten werden, wird dies hier erklärt:
https://sourceware.org/bugzilla/show_bug.cgi?id=9939
Sie müssen alternative Techniken wie ElectricFence, Valgrind, Dmalloc usw. in Betracht ziehen.
Wenn Sie also meinen, "sind die Funktionen malloc () und free () threadsicher", lautet die Antwort "Ja". Aber wenn Sie meinen, "ist die gesamte malloc / free suite threadsicher", lautet die Antwort NEIN.
quelle
Kurze Antwort: Ja, ab C11, der ersten Version des C-Standards, die das Konzept von Threads enthält, müssen
malloc
Freunde threadsicher sein. Viele Betriebssysteme, die beide Threads und eine C-Laufzeit enthielten, haben diese Garantie lange vor dem C-Standard gegeben, aber ich bin nicht bereit, allen zu schwören . Allerdingsmalloc
und Freunde sind nicht und nie aufgefordert wurden , einspringende zu sein.Das heißt, es ist sicher, mehrere Threads gleichzeitig aufzurufen
malloc
und zu verwenden,free
ohne sich Gedanken über das Sperren zu machen, solange Sie keine der anderen Regeln für die Speicherzuweisung verletzen (z. B.free
einmal und nur einmal für jeden von zurückgegebenen Zeiger aufrufenmalloc
). Es ist jedoch nicht sicher, diese Funktionen von einem Signalhandler aus aufzurufen, der möglicherweise einen Aufruf anmalloc
oderfree
in dem Thread, der das Signal verarbeitet, unterbrochen hat . Wenn Sie Funktionen verwenden, die über ISO C hinausgehen, können Sie manchmal sicherstellen, dass der Thread, der das Signal verarbeitet, einen Aufruf vonmalloc
oderfree
, z. B. mitsigprocmask
undsigpause
, nicht unterbrochen hat. Versuchen Sie dies jedoch nicht, es sei denn, Sie haben keine andere Option, da es schwierig ist, die richtigen Ergebnisse zu erzielen.Lange Antwort mit Zitaten: Der C-Standard hat in der Überarbeitung von 2011 ein Thread-Konzept hinzugefügt (Link führt zum Dokument N1570, das dem offiziellen Text des 2011-Standards, der kostenlos öffentlich verfügbar ist, am nächsten kommt). In dieser Überarbeitung heißt es in Abschnitt 7.1.4 Absatz 5 :
Soweit ich weiß, ist dies eine langwierige Art zu sagen, dass die durch den C-Standard definierten Bibliotheksfunktionen threadsicher sein müssen (im üblichen Sinne: Sie können sie von mehreren Threads gleichzeitig aufrufen, ohne sich selbst zu sperren , solange sie nicht mit den als Argumente übergebenen Daten in Konflikt geraten), es sei denn, die Dokumentation für eine bestimmte Funktion besagt ausdrücklich, dass dies nicht der Fall ist.
Dann bestätigt 7.22.3p2 , dass malloc, calloc, realloc, align_alloc und insbesondere free threadsicher sind:
Kontrast , was es sagt über strtok, was nicht und nie ist gewesen Thread-sicher, in 7.24.5.8p6 :
(Kommentar zur Fußnote: nicht verwenden
strtok_s
, verwendenstrsep
.)Ältere Versionen des C-Standards sagten überhaupt nichts über die Gewindesicherheit aus. Aber sie tat sagt etwas über reentrancy, weil Signale immer einen Teil des C Standard. Und dies ist, was sie sagten und auf den ursprünglichen ANSI C-Standard von 1989 zurückgingen (dieses Dokument hat einen nahezu identischen Wortlaut, unterscheidet sich jedoch stark von der Abschnittsnummerierung des ISO C-Standards, der im folgenden Jahr herauskam):
Das ist eine langatmige Art zu sagen , dass C - Bibliotheksfunktionen sind nicht einspringenden als allgemeine Regel sein , erforderlich. Ein sehr ähnlicher Wortlaut erscheint immer noch in C11, 7.14.1.1p5 :
POSIX erfordert eine viel längere, aber im Vergleich zur Gesamtgröße der C-Bibliothek immer noch kurze Liste von Funktionen, die von einem "asynchronen Signalhandler" sicher aufgerufen werden können, und definiert auch detaillierter die Umstände, unter denen ein Signal "anders auftreten kann" als Ergebnis des Aufrufs der Abbruch- oder Erhöhungsfunktion. " Wenn Sie mit Signalen etwas nicht Triviales tun, schreiben Sie wahrscheinlich Code, der auf einem Betriebssystem mit Unix-Charakter ausgeführt werden soll (im Gegensatz zu Windows, MVS oder etwas Eingebettetem, das wahrscheinlich keine vollständig gehostete Implementierung von C in hat an erster Stelle), und Sie sollten sich mit den POSIX-Anforderungen für sie sowie den ISO C-Anforderungen vertraut machen.
quelle
Dies hängt davon ab, welche Implementierung der C-Laufzeitbibliothek Sie verwenden. Wenn Sie beispielsweise MSVC verwenden, gibt es eine Compileroption, mit der Sie angeben können, mit welcher Version der Bibliothek Sie erstellen möchten (dh eine Laufzeitbibliothek, die Multithreading unterstützt, indem sie für das Profil sicher ist oder nicht).
quelle
Nein, es ist nicht threadsicher. Möglicherweise ist in Ihrer C-Bibliothek tatsächlich eine
malloc_lock()
und-malloc_unlock()
Funktion verfügbar. Ich weiß, dass diese für die Newlib-Bibliothek existieren. Ich musste dies verwenden, um einen Mutex für meinen Prozessor zu implementieren, der in der Hardware über mehrere Threads verfügt.quelle
malloc und free sind nicht wiedereintrittsfähig, da sie eine statische Datenstruktur verwenden, die aufzeichnet, welche Speicherblöcke frei sind. Infolgedessen sind keine Bibliotheksfunktionen, die Speicher zuweisen oder freigeben, wiedereintrittsfähig.
quelle
Nein ist es nicht.
Webarchiv-Link (Original ist tot)
quelle
Ich schlage vor zu lesen
des Buches The Linux Programming Interface erklärt den Unterschied zwischen Thread-Sicherheit und Wiedereintritt sowie
malloc
.Auszug:
Auf jeden Fall eine Lektüre wert.
Und um Ihre Frage zu beantworten,
malloc
ist threadsicher, aber nicht wiedereintrittsfähig.quelle