2013-05-20 19 views
9

Stiamo usando unLe funzioni membro del thread std :: wstring_convert sono sicure?

std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter; 

in un logger di nostra che ottiene una stringa UTF-16 da un componente legacy e lo converte in UTF-8 che si scriva il registro. Il convertitore viene creata un'istanza per ogni conversione, su cui facciamo

auto utf8string = converter.to_bytes(utf16string); 

Questo viene fatto in una parte abbastanza intenso e multi-threaded del nostro codice e mi piacerebbe ri-utilizzare un'istanza del convertitore, ma seing che std::wstring_convert espone uno "stato", sono preoccupato che to_bytes non è thread-safe e gli utili abbiamo potuto ottenere riutilizzando la stessa istanza sarei perso dal blocco eccessiva che sarebbe poi necessaria (nel qual caso non lo farei condividi comunque l'istanza).

Quindi, è std::wstring_convert<>::to_bytes thread-safe?

EDIT: Un chiarimento su quello che sto veramente chiedendo: Data un'istanza di std::wstring_convert<>, se 2 o più thread contemporaneamente chiamano to_bytes su tale istanza con argomenti diversi, è to_bytes quindi garantito a comportarsi bene?

+0

@LucDanton: Penso che sia "permesso" per annotare un astratto 2 linee della parte importante ("const significa thread-safe") come una risposta e aggiungere il link per il resto - allora posso accettare la tua risposta. –

+0

Una precisazione al commento di cui sopra - il "const significa thread-safe" dovrebbe essere cambiato in "const significa thread-safe e to_bytes non è const, il che significa che potrebbe cambiare lo stato istanza" –

+0

@LucDanton: Duh! grazie per averlo notato - cambiato. Certo che è 'to_bytes' (facepalm) –

risposta

1

Poiché std::wstring_convert fa parte della libreria standard, segue certain rules quando si tratta di gestire un oggetto di tale tipo da thread diversi.

In particolare, perché entrambi to_bytes e from_bytes sovraccarichi siano non const, non è possibile utilizzare tali membri dipendenza da un particolare oggetto da diversi fili senza sincronizzazione. Questo ha senso, dato che le conversioni di codectt fanno tipicamente uso di un oggetto state_type. Usarlo senza sincronizzazione porterebbe al disastro.

Problemi correlati