[英]Is boost::lexical_cast thread-safe?
我實際上未能在Boost文檔中找到此問題的答案。 我對在多線程環境中使用atof
感到有些偏執,因此建議將調用替換為lexical_cast
。 lexical_cast
是線程安全的嗎?
是的, boost::lexical_cast
不會以任何方式修改輸入字符串,並且如果在多個線程的同一字符串上運行,則會產生新的輸出。
它創建了一個stringstream
,該stringstream
本身不是線程安全的,即,如果不進行同步就不能在線程之間共享它,而是在每個線程中使用不同的stringstream
對象。
我在lexical_cast
遇到的問題是為什么我避免使用它是它拋出的異常的完全無用(bad_cast,沒有上下文)。 但是,這是一個單獨的問題,而不是線程安全性。
lexical_cast的另一個問題(局限性)是它將僅使用C語言環境(經典)。 因此,如果您有自己的功能(例如日期時間),並且想在其上使用lexical_cast,則可能會嘗試將經典語言環境修改為一種解決方法,否則它將停止線程安全,除非它是一開始就完成。
實際上,如果您正在解析文件,則最好使用boost::spirit
如果它具有特定的語法)或boost::serialize
或常規istream來更好。 實際上, boost::lexical_cast
為此目的效率極低,因為它會為每個令牌創建一個新的流。
並發調用lexical_cast
是安全的。 但是請注意,它取決於(至少對於我安裝的Boost版本而言)當前安裝的C ++語言環境。 用戶應手動同步對已安裝的C ++(以及C)語言環境的訪問。 請參閱此處的數據競賽部分。 因此,例如,並發調用lexical_cast
和std::locale::global
是不安全的。 盡管如此,除了在程序啟動時以外,更改已安裝的C / C ++語言環境被認為是不好的做法。
它沒有在文檔中提及任何有關線程安全的內容,因此可以假設的安全事實不是。 我發現此郵件列表似乎支持此概念。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.