new
a delete
jsou vlákno bezpečné
Aby byly vlákno bezpečné, jsou vyžadovány následující funkce:
- Verze knihovny
operator new
aoperator delete
- Uživatelské verze globálního
operator new
aoperator delete
std::calloc
,std::malloc
,std::realloc
,std::aligned_alloc
,std::free
Volání těchto funkcí, které alokují nebo dealokují konkrétní jednotku úložiště, probíhají v jediné celkové objednávce a každé takové volání dealokace se děje – před další alokací (pokud existuje) v tomto pořadí.
S gcc, new
se implementuje delegováním na malloc
, a vidíme, že jejich malloc
skutečně používá zámek. Pokud se obáváte, že vaše alokace způsobí úzká místa, napište si vlastní alokátor.
Odpověď je ano, ale v praxi je to obvykle není problém. Pokud je to pro vás problém, můžete zkusit nahradit svou implementaci malloc za tcmalloc, který omezí, ale neodstraní možné spory (protože existuje pouze 1 halda, kterou je třeba sdílet mezi vlákny a procesy).
TCMalloc přiřadí každému vláknu lokální mezipaměť vlákna. Malé alokace jsou uspokojeny z místní mezipaměti podprocesu. Objekty se podle potřeby přesouvají z centrálních datových struktur do lokální mezipaměti vláken a k migraci paměti zpět z lokální mezipaměti vláken do centrálních datových struktur se používají pravidelné sběry odpadků.
Existují také další možnosti, jako je použití vlastních alokátorů a/nebo specializovaných kontejnerů a/nebo přepracování vaší aplikace.