2009-09-27 7 views
10

So che non esiste il concetto di thread nel corrente C++, ma this article is saying:I flussi di output standard in C++ sono thread-safe (cout, cerr, clog)?

A typesafe, threadsafe, portatile meccanismo di registrazione

.....

La funzione fprintf() è protetta da thread, quindi, anche se questo registro viene utilizzato da thread diversi, le righe di output non verrà codificato.

Che dire cout, cerr e clog?

Penso che questa domanda sia applicabile a tutti i tipi di flusso in C++ anche, come fstream e stringstream.

+2

[Nota: la risposta è ora "sì", in C++ 11] (http://stackoverflow.com/a/6374525/87234). – GManNickG

+0

@GManNickG: Uso Visual Studio 2013 C++ e cout non è ancora sicuro. le uscite sullo schermo sono per lo più corrotte/mescolate. –

+0

@MehmetFide: la sicurezza del thread è diversa dalla sincronizzazione (stringhe miste/interfogliate); Lo standard C++ 11 garantisce che l'implementazione non porti a razze di dati sull'utilizzo di questi oggetti da thread diversi, mentre è compito dell'utente assicurarsi che più chiamate "operator <<" siano sincronizzate. – legends2k

risposta

8

L'articolo fa un reclamo sullo standard POSIX per l'API fprintf. Non dice nulla sugli stream C++. E questo è abbastanza corretto, in quanto non ci sono tali garanzie su quei flussi.

Si noti che, sebbene la classe di registrazione in quell'articolo utilizza la sintassi del flusso C++, lo fa tramite un oggetto std::ostringstream creato e distrutto per ogni evento di registrazione e quindi non condiviso tra i thread. Utilizza fprintf per scrivere effettivamente il contenuto sulla console.

La libreria Microsoft C afferma che alcune affermazioni sono conformi POSIX e quindi il codice nell'articolo è probabilmente abbastanza portatile (come molti altri sistemi operativi diffusi sono conformi a POSIX). Ma questo non significa che gli stream C++ standard siano thread-safe.

9

Questo sarebbe un dettaglio specifico dell'implementazione. Puoi chiedere se il compilatore X con la libreria Run Time Y ha stream standard sicuri per thread, ma non puoi chiedere se tutte le implementazioni lo fanno, perché le implementazioni possono differire per quanto riguarda la sicurezza dei thread. Questo fa parte di ciò che significa che C++ non ha un concetto di thread incorporato. È all specifiche dell'implementazione.

+0

Quello che penso anch'io :) ma l'articolo afferma che il codice è anche portatile! – AraK

+2

Direi che l'autore dell'articolo sta semplicemente dicendo che funziona ovunque lo abbia provato. Probabilmente non l'ha provato, diciamo, Keil C con HomeGrownRTOS v1.2, o un numero qualsiasi di altre combinazioni non comuni. –

+0

L'articolo non sta parlando di stream C++. –

3

Poiché l'attuale standard C++ non riconosce nemmeno che ci sono cose chiamate "discussioni", di certo non fornisce alcuna garanzia in merito alla sicurezza del thread.

Questo è tutto definito dall'implementazione.