簡體   English   中英

boost :: lexical_cast是線程安全的嗎?

[英]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_caststd::locale::global是不安全的。 盡管如此,除了在程序啟動時以外,更改已安裝的C / C ++語言環境被認為是不好的做法。

它沒有在文檔中提及任何有關線程安全的內容,因此可以假設的安全事實不是。 我發現此郵件列表似乎支持此概念。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM