C ++ nuova sicurezza del thread operatore in linux e gcc 4

Presto comincerò a lavorare su una versione parallela di un algoritmo di rifinitura della mesh usando la memoria condivisa.

Un professore all’università ha sottolineato che dobbiamo fare molta attenzione alla sicurezza dei thread perché né il compilatore né lo stl sono consapevoli del thread.

Ho cercato questa domanda e la risposta dipendeva dal compilatore (alcuni cercano di essere piuttosto consapevoli del thread) e dalla piattaforma (se le chiamate di sistema usate dal compilatore sono thread-safe o meno).

Quindi, in linux, il compilatore gcc 4 produce codice thread-safe per il nuovo operatore?

In caso contrario, qual è il modo migliore per superare questo problema ? Forse bloccare ogni chiamata al nuovo operatore?

Dovrai cercare molto difficile trovare una piattaforma che supporti i thread ma non abbia un thread safe new . In effetti, la sicurezza del thread di new (e malloc ) è una delle ragioni per cui è così lento.

Se si desidera un STL sicuro per thread d’altra parte, si può prendere in considerazione Intel TBB che dispone di contenitori thread-aware (anche se non tutte le operazioni su di essi sono thread-safe).

Generalmente il new operatore è thread-safe – tuttavia le garanzie di sicurezza dei thread per le chiamate nell’STL e la libreria standard sono regolate dallo standard – questo non significa che siano thread inconsapevoli – tendono ad avere garanzie 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 la creazione di aggiornamenti non lo sono. Devi leggere la documentazione e vedere quali sono le varie garanzie, anche se non sono così onerose e tendono a dare un senso.

Mentre sto parlando di concetti che non ho usato, sento che dovrei menzionare che se stai usando la memoria condivisa, probabilmente vorresti assicurarti di usare solo i tipi di POD e di usare il posizionamento nuovo.

In secondo luogo, se si utilizza la memoria condivisa come comunemente si intende nei sistemi Linux, è ansible che si stiano utilizzando 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 dell’applicazione e delle librerie non è importante – ciò che è importante, tuttavia, è la sicurezza del thread di qualsiasi cosa che usi l’allocazione della memoria condivisa! Questa è una situazione diversa rispetto all’esecuzione di un processo con molti thread, nel qual caso chiedere informazioni sulla sicurezza del thread del nuovo operatore È un problema valido e potrebbe essere risolto dal posizionamento nuovo se non lo è, oppure definendo i propri allocatori.

Bene, questa non è una risposta definitiva alla mia domanda, solo che ho scoperto che Google ha implementato un malloc multi-threaded ad alte prestazioni .

Pertanto, se hai dei dubbi sul fatto che la tua implementazione sia sicura per i thread, forse dovresti utilizzare gli Strumenti delle prestazioni di Google .