Est malloc thread-safe?
Est le malloc()
fonction de re-venu?
- connexes: stackoverflow.com/questions/147298/...
- Votre titre et le corps de demander deux choses différentes. Ré-entrant signifie normalement "peut être utilisé en toute sécurité dans un gestionnaire de signal", tandis que le thread-safe signifie normalement "peut être utilisé en toute sécurité dans les discussions". Il est plus facile d'avoir thread-safe de ré-entrant.
Vous devez vous connecter pour publier un commentaire.
J'ai lu quelque part que si vous compilez avec -pthread, malloc devient thread-safe. Im assez sûr de sa mise en œuvre à charge si, depuis malloc est la norme ANSI C et les threads ne sont pas.
Si nous parlons de la gcc:
http://groups.google.com/group/comp.lang.c.moderated/browse_thread/thread/2431a99b9bdcef11/ea800579e40f7fa4
Un autre avis, le plus perspicace
http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2005-07/0323.html
-pthreads
n'en fait pas automatiquement malloc thread-safe. Si vous appelez la fonction malloc dans un gestionnaire de signal toutes sortes de fou non-sens peut arriver.Question: "est-malloc réentrant"?
Réponse: non, il n'est pas. Voici une définition de ce qui fait une routine réentrant.
Aucun de la commune versions de malloc vous permettre de re-entrer (par exemple à partir d'un gestionnaire de signal). Notez que réentrante routine ne peut pas utiliser des verrous, et presque tous les malloc versions de l'existence de n'utiliser des verrous (ce qui les rend thread-safe) ou le/les variables statiques (ce qui les rend thread-dangereux et non réentrant).
Toutes les réponses jusqu'à présent de réponse "malloc est thread-safe?", qui est une question entièrement différente. Pour que question, la réponse est ça dépend sur votre bibliothèque d'exécution, et éventuellement sur les drapeaux du compilateur que vous utilisez. Sur tous les UNIX, vous obtiendrez un "thread-safe" malloc par défaut. Sur Windows, l'utilisation
/MT
,/MTd
,/MD
ou/MDd
indicateurs pour obtenir thread-safe de la bibliothèque d'exécution.Voici un extrait de malloc.c de la glibc :
Fil-sécurité: thread-safe, sauf si NO_THREADS est défini
en supposant NO_THREADS n'est pas défini par défaut, la fonction malloc est thread-safe au moins sur linux.
C'est tout à fait une vieille question, et je veux apporter de la fraîcheur selon l'état actuel des choses.
Oui, actuellement
malloc()
est thread-safe.De la Bibliothèque GNU C Manuel de Référence de
glibc-2.20 [released 2014-09-07]
:Oui, en vertu de POSIX.1-2008 date de
malloc
est thread-safe.Si vous travaillez avec la GLIBC, la réponse est: Oui, MAIS.
Spécifiquement, oui, MAIS, s'il vous plaît, s'il vous plaît être conscient que, bien que malloc et free sont thread-safe, les fonctions de débogage ne sont pas.
Spécifiquement, il est extrêmement utile mtrace(), mcheck(), et mprobe() fonctions ne sont pas thread-safe. Dans l'un des plus court, rectiligne des réponses que vous ne verrez jamais à partir d'un projet GNU, c'est expliqué ici:
https://sourceware.org/bugzilla/show_bug.cgi?id=9939
Vous aurez besoin d'examiner d'autres possibilités techniques, telles que la ElectricFence, valgrind, dmalloc, etc.
Donc, si vous voulez dire, "sont le malloc() et free() les fonctions de thread-safe", la réponse est oui. Mais si vous voulez dire, "c'est l'ensemble de malloc/free suite thread-safe", la réponse est NON.
Cela dépend de la mise en œuvre de la bibliothèque runtime C que vous utilisez. Si vous êtes à l'aide de MSVC par exemple puis il y a une option de compilation qui permet de spécifier la version de la bibliothèque que vous voulez construire avec (c'est à dire au moment de l'exécution de la bibliothèque qui prend en charge le multi-threading en étant de la bande de roulement-safe ou pas).
Non, il n'est pas thread-safe. Il peut être une
malloc_lock()
etmalloc_unlock()
fonction disponible dans votre bibliothèque C de. Je sais qu'il en existe pour la Newlib de la bibliothèque. J'ai eu à l'utiliser pour mettre en œuvre un mutex pour mon processeur, qui est multi-thread dans le matériel.malloc et free sont pas réentrant, car ils utilisent une statique de la structure de données qui enregistre ce que les blocs de mémoire sont gratuits. En conséquence, aucune des fonctions de la bibliothèque qui allouer ou libérer de la mémoire sont réentrant.
Réponse courte: oui, comme de C11, qui est la première version de la norme C qui inclut la notion de threads,
malloc
et les amis doivent être thread-safe. De nombreux systèmes d'exploitation qui comprennent à la fois fils et un C runtime fait de cette garantie long avant que la norme C fait, mais je ne suis pas prêt à le jurer tous. Cependant,malloc
et les amis ne sont pas et n'ont jamais été nécessaires pour être réentrant.Que les moyens, il est possible d'appeler des
malloc
etfree
à partir de plusieurs threads simultanément et ne pas s'inquiéter de verrouillage, aussi longtemps que vous n'êtes pas violer aucune des autres règles d'allocation de mémoire (par exemple, appelerfree
une fois et une seule fois sur chaque pointeur retourné parmalloc
). Mais il est pas sûr d'appeler ces fonctions à partir d'un gestionnaire de signal qui pourrait avoir interrompu un appel àmalloc
oufree
dans le fil de la manipulation du signal. Parfois, à l'aide de la fonctionnalité au-delà de la norme ISO C, vous pouvez garantir que la manipulation du fil le signal n'a pas interrompre un appel àmalloc
oufree
, par exemple, avecsigprocmask
etsigpause
, mais essayez de ne pas le faire sauf si vous n'avez pas d'autre option, parce que c'est dur pour obtenir parfaitement droit.Longue réponse avec citation: Le C standard ajouté une notion de threads dans le 2011 révision (lien vers le document N1570, qui est l'approximation la plus proche pour le texte officiel de l'2011 standard à la disposition du public sans frais). Dans le cadre de cette révision, la section 7.1.4 paragraphe 5 états:
Comme je le comprends, c'est un travail de longue haleine manière de dire que la bibliothèque de fonctions définies par la norme doivent être thread-safe (dans le sens habituel: vous pouvez appeler à partir de plusieurs threads simultanément, sans avoir à vous bloquer vous-même, aussi longtemps qu'ils ne finissent pas s'entrechoquant sur les données passées en argument) à moins que la documentation d'une fonction spécifique spécifiquement dit qu'il ne l'est pas.
Puis, 7.22.3p2 confirme que malloc, calloc, realloc, aligned_alloc, et libre, en particulier, sont thread-safe:
Revanche ce qu'il dit à propos de strtok, ce qui n'est pas et n'a jamais été thread-safe, dans 7.24.5.8p6:
(commentaire sur la note: ne pas utiliser
strtok_s
, utilisezstrsep
.)Les anciennes versions du C standard ne rien dire à propos de la sécurité des threads. Cependant, ils ne dire quelque chose à propos de la réentrée, parce que les signaux ont toujours fait partie de la norme. Et c'est ce qu'ils ont dit, revenons à l'origine 1989 C ANSI standard (ce document a nigh-un libellé identique à, mais très différente de la section numérotation à partir de la norme ISO C standard qui est sorti l'année suivante):
Qui est un travail de longue haleine façon de dire que les fonctions de la bibliothèque C sont pas doivent être réentrant comme une règle générale. Très libellé similaire apparaît toujours en C11, 7.14.1.1p5:
POSIX nécessite un beaucoup plus de temps, mais toujours courte par rapport à la taille globale de la bibliothèque C, la liste des fonctions en toute sécurité être appelé à partir d'un "asynchrone gestionnaire de signal", et définit également plus en détail les circonstances dans lesquelles un signal de "se produire que sur le résultat de l'appel de l'abandon ou de soulever la fonction". Si vous faites quelque chose de non trivial avec des signaux, vous êtes probablement à l'écriture de code destiné à être exécuté sur un système d'exploitation Unix nature (contrairement à Windows, MVS, ou quelque chose d'intégré qui n'a sans doute pas complète hébergé mise en œuvre de C en premier lieu), et vous devez vous familiariser avec les POSIX exigences pour eux, ainsi que la norme ISO C exigences.
Non, il n'est pas.
Archive Web lien (original a disparu morts)