2013-05-20 22 views
9

UżywamyCzy funkcje składowe wątku std :: wstring_convert są bezpieczne?

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

w rejestratorze od naszego, że dostaje UTF-16 łańcuch ze składnika starszego i zamienia go na UTF-8, które piszemy do dziennika. Przetwornica zostanie instancja na każdej konwersji, na której robimy

auto utf8string = converter.to_bytes(utf16string); 

Odbywa się to w dość intensywne i wielowątkowych część naszego kodu i chciałbym ponownie wykorzystać jedno wystąpienie konwertera, ale "Obawiam się, że std::wstring_convert ujawnia" stan ", obawiam się, że to_bytes nie jest bezpieczny dla wątków, a wszelkie zyski, które moglibyśmy uzyskać przez ponowne użycie tego samego wystąpienia, zostałyby utracone przez nadmierne blokowanie, które byłoby wtedy potrzebne (w takim przypadku nie byłoby udostępnić instancję mimo to).

Czy jest bezpieczny std::wstring_convert<>::to_bytes wątek?

EDIT: wyjaśnienie o co mi naprawdę pytając: Biorąc pod uwagę jedno wystąpienie std::wstring_convert<>, jeśli 2 lub więcej wątków jednocześnie wywołać to_bytes na ten przykład z różnymi argumentami, jest to_bytes gwarantowana następnie dobrze zachowywać?

+0

@LucDanton: Myślę, że "wolno" napisać 2-liniowy abstrakt ważnej części ("const oznacza wątek bezpieczny") jako odpowiedź i dodać link do reszty - wtedy mogę zaakceptować twoją odpowiedź. –

+0

Wyjaśnienie powyższego komentarza - "const oznacza wątek bezpieczny" należy zmienić na "const oznacza wątek bezpieczny i to_bytes nie jest const, co oznacza, że ​​może zmienić stan wystąpienia" –

+0

@LucDanton: duh! dzięki za uwagę - zmienił to. Oczywiście jest to 'to_bytes' (facepalm) –

Odpowiedz

1

Ponieważ std::wstring_convert jest częścią Biblioteki Standardowej, jest zgodna z certain rules, jeśli chodzi o obsługę obiektu tego typu z różnych wątków.

W szczególności, ponieważ przeciążenia to_bytes i from_bytes nie są const, nie jest możliwe użycie tych elementów na jednym konkretnym obiekcie z różnych wątków bez synchronizacji. Ma to sens, ponieważ konwersje kodeków zwykle używają obiektu state_type. Używanie go bez synchronizacji doprowadziłoby do katastrofy.