2010-03-09 109 views
2

在回答這個question ovanes指出:什麼時候C++流對象使用互斥鎖?

請注意, 的boost :: lexical_cast的是 的atoi慢得多。我還經常在 性能非關鍵代碼中使用它。 lexical_cast的 問題是它 使用stringstream進行轉換。如果您 在從 標準庫將使用鎖在一個互斥 每個字符多線程 environement任何流類工作被插入, 即使流對象從 單thread.Your數量由使用17個字符的 將涉及17個互斥鎖 鎖定時投入。 - ovanes 6月22日11時59

這引出了一個問題,什麼時候<iostream>對象鎖定一個互斥?這是否也適用於<sstream>的物體?如果這樣可以防止?

回答

4

當前的C++標準(C++ 03)不包含任何有關多線程的內容。

因此,庫如何使用互斥鎖取決於具體的實現。

0

string_stream的問題是它很重。這與Mutexes無關。

我會解釋爲什麼:

  • stringstream的使用通用接口訪問底層的緩衝區,與用於文件或控制檯訪問:一組虛擬功能。它慢於迭代char *
  • 它使用語言環境信息,以便實際分析字符串,該字符串取決於千位分隔符的類型或取決於語言環境接口中其他類的不同類型的數字。
  • 最後它調用atoi將字符串轉換爲數字。

lexical_cast是非常強大的,因爲它允許施放任何價值,並與atoi完成,但與動力來自價格不僅整數。

第二件事,我不認爲任何string_buffer實現使用互斥體。文件流有意義但不包含字符串流。