new
et delete
sont thread-safe
Les fonctions suivantes doivent être thread-safe :
- Les versions de bibliothèque de
operator new
etoperator delete
- Versions utilisateur de remplacement du
operator new
global etoperator delete
std::calloc
,std::malloc
,std::realloc
,std::aligned_alloc
,std::free
Les appels à ces fonctions qui allouent ou désallouent une unité de stockage particulière se produisent dans un seul ordre total, et chacun de ces appels de désallocation se produit avant la prochaine allocation (le cas échéant) dans cet ordre.
Avec gcc, new
est implémenté en déléguant à malloc
, et on voit que leur malloc
utilise en effet une serrure. Si vous craignez que votre allocation ne provoque des goulots d'étranglement, écrivez votre propre répartiteur.
La réponse est oui, mais en pratique c'est habituellement pas un problème. Si c'est un problème pour vous, vous pouvez essayer de remplacer votre implémentation de malloc par tcmalloc qui réduit, mais n'élimine pas les conflits possibles (puisqu'il n'y a qu'un seul tas qui doit être partagé entre les threads et les processus).
TCMalloc attribue à chaque thread un cache local de thread. Les petites allocations sont satisfaites à partir du cache local des threads. Les objets sont déplacés des structures de données centrales vers un cache local de thread selon les besoins, et des récupérations de place périodiques sont utilisées pour migrer la mémoire d'un cache local de thread vers les structures de données centrales.
Il existe également d'autres options telles que l'utilisation d'allocateurs personnalisés et/ou de conteneurs spécialisés et/ou la refonte de votre application.