Generalmente il new
operator è thread-safe - tuttavia le garanzie di sicurezza del thread per le chiamate nell'STL e nella libreria standard sono regolate dallo standard - questo non significa che non siano a conoscenza del thread - tendono ad avere garanzie molto ben definite di sicurezza del thread per determinate operazioni. Ad esempio, l'iterazione di un elenco in modalità di sola lettura è thread-safe per più lettori, mentre l'iterazione di un elenco e l'esecuzione di aggiornamenti non lo sono. Devi leggere la documentazione e vedere quali sono le varie garanzie, anche se non sono così onerose e tendono ad avere un senso.
Mentre sto parlando di concetti che non ho usato, sento di dover menzionare che se stai usando la memoria condivisa, allora probabilmente vorrai assicurarti di usare solo i tipi POD e usare il nuovo posizionamento.
In secondo luogo, se stai utilizzando la memoria condivisa come è comunemente inteso sui sistemi Linux, potresti utilizzare più processi, non thread, per allocare memoria e "fare cose", utilizzando la memoria condivisa come livello di comunicazione. Se questo è il caso, la sicurezza del thread della tua applicazione e delle tue librerie non è importante - ciò che è importante, tuttavia, è la sicurezza del thread di qualsiasi cosa utilizzi l'allocazione di memoria condivisa! Questa è una situazione diversa rispetto all'esecuzione di un processo con molti thread, nel qual caso chiedere informazioni sulla sicurezza dei thread dell'operatore new È una preoccupazione valida e potrebbe essere affrontata posizionando new se non lo è, o definendo i propri allocatori.
Dovrai cercare molto attentamente per trovare una piattaforma che supporti i thread ma non abbia un thread safe new
. Infatti, la thread safety di new
(e malloc
) è uno dei motivi per cui è così lento.
Se invece desideri un STL thread-safe, puoi prendere in considerazione Intel TBB che dispone di contenitori thread-aware (sebbene non tutte le operazioni su di essi siano thread-safe).