2014-10-15 12 views
9

Sono certo che, in pratica, l'uso di ::new è thread-safe. La mia domanda è quale parte dello standard prevede tale garanzia, se esiste? È una convenzione? È qualcosa in cui lo standard dà molta libertà alle implementazioni (come i vincoli relativamente sciolti su quale dimensione ciascun tipo di dati è) per supportare un'ampia varietà di hardware?Sicurezza thread di :: new in C++ 11

Spero che ci sia solo una riga nello standard C++ 11 da qualche parte che specifica esplicitamente "le implementazioni di ::new devono essere thread-safe".

Mi piacerebbe anche vedere alcuni standard sulla sicurezza del thread di nuovi sovraccarichi dell'operatore. Immagino che avrebbero anche bisogno di essere richiesto per essere protetto da thread, ma queste funzioni non rientrano nella garanzia coperta che const => thread safe (in C++ 11).

Grazie!

+0

Perché lo standard garantisce all'utente che il sovraccarico di questo operatore è sicuro per i thread? Il tuo programma, i tuoi problemi. – MSalters

+0

@MSalters - Per la stessa ragione per cui rende const => thread-safe. Perché senza garantire anche quella garanzia nel tuo codice, non puoi interagire con la libreria standard in modo sicuro. Puoi spararti ai piedi? Sì, come quasi tutto in C++ ... ma non è questo il punto. – Mark

risposta

9

Credo che questo sia implicitamente garantito dallo standard C++ 11. Se così non fosse, l'utilizzo dell'espressione nuova o nuova dell'operatore potrebbe causare una corsa di dati e ciò non sarebbe consentito dallo standard. Per riferimento, vedere §17.6.5.9 corsa dati evitamento e anche

18.6.1.4 gare dati [new.delete.dataraces]

"Le versioni della libreria di operatori nuovi e operatore delete, la sostituzione utente le versioni dell'operatore globale new e l'operatore delete e le funzioni di libreria standard C calloc, malloc, realloc e free non devono introdurre razze di dati (1.10) come risultato di chiamate simultanee da thread differenti Chiamate a queste funzioni che allocano o deallocano un particolare unità di archiviazione deve avvenire in un unico ordine totale e ciascuna di tali chiamate di allocazione deve avvenire prima della successiva assegnazione (se prevista) in questo ordine. "

I propri override o le proprie sostituzioni per gli operatori globali devono corrispondere a questo requisito anche per.

Vedere anche questo proposal N3664 "Clarifying Memory Allocation", che pone maggiormente l'accento su tale questione.

2

Lo standard C++ non richiede nettamente che new sia thread-safe. Alcune implementazioni supportano esplicitamente la creazione di codice C++ in modalità single-threaded, in cui la libreria standard C, incluso mallloc() potrebbe non essere thread-safe. Le piattaforme che la maggior parte di noi utilizza ogni giorno offre ovviamente allocazioni thread-safe.

Anche se la piattaforma offre un thread safe new, è necessario essere cauti se si utilizzano librerie che implementano il proprio operator new o se lo si fa da soli. È certamente possibile scrivere un new che funziona solo in un singolo thread, forse anche intenzionalmente!

Problemi correlati