2013-05-20 43 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線程安全嗎?

編輯:什麼我真的問一個澄清:鑑於std::wstring_convert<>一個實例,如果2個或多個線程同時呼籲該實例to_bytes使用不同的參數,是to_bytes然後保證表現良好?

+0

@LucDanton:我認爲它是「允許」記下重要部分的兩行摘要(「const表示線程安全」)作爲答案併爲其餘部分添加鏈接 - 然後我可以接受您的答案。 –

+0

對上述註釋的澄清 - 「const表示線程安全」應該改爲「const表示線程安全並且to_bytes不是const,這意味着它可能改變實例狀態」 –

+0

@LucDanton:duh!感謝注意 - 改變了它。當然它是'to_bytes'(facepalm) –

回答

1

由於std::wstring_convert是標準庫的一部分,因此在涉及從不同線程處理此類型的對象時,它遵循certain rules

特別是,因爲to_bytesfrom_bytes重載都是非const,所以不可能在沒有同步的情況下在不同線程的任何一個特定對象上使用這些成員。這很有意義,因爲codecvt轉換通常使用state_type對象。沒有同步使用它會導致災難。

相關問題