L'immagine di Visual Studio "blocca altri thread". C'è una versione alternativa _fread_nolock, che legge "senza bloccare altri thread", che dovrebbe essere usata solo "in contesti thread-safe come applicazioni a thread singolo o dove l'ambito chiamante già gestisce l'isolamento del thread."Quale livello si blocca? A che livello devono essere attivi?
Anche dopo aver letto altre discussioni piuttosto rilevanti sui due, sono confuso se il blocco fread implementa su una specifica struttura FILE, un file specifico specifico, o su tutte le chiamate su file completamente diversi.
Se si utilizzano le versioni nolock, quale livello di blocco è necessario fornire? Più thread in parallelo possono leggere file separati senza alcun blocco? Più thread in parallelo possono scrivere file separati senza alcun blocco? O ci sono variabili globali o statiche coinvolte che potrebbero essere danneggiate?
Quindi, utilizzando le versioni nolock, è possibile ottenere un throughput I/O migliore (se non si stanno muovendo inutilmente teste, come leggere unità separate o un'unità SSD), o è il potenziale guadagno basta ridurre le serrature ridondanti a un unico blocco (che dovrebbe essere trascurabile).
La funzione di ifstream.read funziona come quella normale? (Non vedo una versione nolock di esso.)
La libreria di runtime C risale a un tempo lungo, molto prima che i sistemi operativi supportassero i thread. La specifica non è mai stata aggiornata per dire cosa * dovrebbe * accadere quando due thread chiamano fread() sullo stesso file. Quindi gli scrittori di librerie dovevano arrangiarsi da soli per far funzionare le vecchie specifiche. Non è come se il CRT fornisse ai programmatori un altro modo. Le probabilità che tu sia * effettivamente * avanti cercando di aggirare il blocco è molto bassa, l'I/O è piuttosto lento. Tuttavia, ciò non è vero in tutti i casi, ad esempio le locali sono estremamente costose. Il destino della maggior parte dei programmi che cerca di farlo bene è quello di evitare il CRT. –