2013-05-20 2 views
9

우리는 기존의 구성 요소에서 UTF-16 문자열을 가져옵니다 및 UTF-8 우리가 로그에 쓰기로 변환 우리의 로거에std :: wstring_convert의 멤버 함수는 안전합니까?

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

을 사용하고 있습니다. 컨버터는 우리가 할 수있는시, 각각의 변환에 인스턴스화됩니다

auto utf8string = converter.to_bytes(utf16string); 

, 이것은 우리의 코드를 꽤 많이와 멀티 스레드 부분에서 이루어집니다 내가 컨버터의 재사용 하나 개의 인스턴스에 싶지만 "std::wstring_convert이"상태 "를 노출한다는 것을 알고 있다면 나는 to_bytes이 스레드 안전하지 않으며 동일한 인스턴스를 다시 사용하여 얻을 수있는 이득이 과도한 잠금에 의해 손실 될 것이라고 우려하고 있습니다. 인스턴스를 공유하십시오.).

따라서 std::wstring_convert<>::to_bytes은 안전합니까?

편집 : 정말 부탁 해요 무엇인지에 대한 설명 : 2 개 이상의 스레드가 동시에 다른 인수와 함께 해당 인스턴스에 to_bytes를 호출하는 경우, std::wstring_convert<>의 인스턴스을 감안할 때, to_bytes 다음 잘 동작하도록 보장된다?

+0

@LucDanton : 중요한 부분 ("const는 스레드 안전함"을 의미 함)의 2 줄 초록을 대답으로 채우고 나머지 부분에 대한 링크를 추가하는 것은 "허용"된 것 같습니다. 그러면 답을 수락 할 수 있습니다. –

+0

위의 설명에 대한 설명 - "const는 스레드 안전을 의미합니다"는 "const는 스레드 안전을 의미하고 to_bytes는 const가 아니므로 인스턴스 상태가 변경 될 수 있음을 의미합니다" –

+0

@LucDanton : duh! 주의 해 주셔서 고마워요. 물론 그것은 'to_bytes' (facepalm)입니다. –

답변

1

std::wstring_convert은 표준 라이브러리의 일부이기 때문에 다른 스레드에서 이러한 유형의 객체를 처리 할 때는 certain rules을 따릅니다.

특히, to_bytesfrom_bytes 오버로드가 모두 const이 아니므로 동기화하지 않고 다른 스레드의 특정 개체에 이러한 구성원을 사용할 수 없습니다. 코덱 변환에서는 일반적으로 state_type 개체를 사용하기 때문에 이는 의미가 있습니다. 동기화하지 않고 사용하면 재앙이 발생할 수 있습니다.

관련 문제