2009-11-20 31 views
3

讀問題Why doesn’t C++ STL support atoi(const string&) like functions?,我遇到它警告說,海灣合作委員會(至少)有bug可以減緩其使用ostringstream頻繁多線程應用程序的註釋。這顯然是由於C++語言環境機制'需要'的互斥體。解釋爲互斥的需要語言環境,請

鑑於我在全球化實踐recent interest,我不知道是否有人能向我解釋爲什麼一個Locale對象需要一個互斥?什麼是可以在需要互斥體的語言環境中進行更改?它不應該是隻讀設施嗎?

回答

3

這真是一個執行問題,但std::locale具有檢索和設置的「全球性」語言環境的靜態函數。全局語言環境被定義爲在標準庫的幾個區域中使用,這意味着某處必須有全局語言環境。

在支持線程的實現中,很可能需要通過某種鎖定機制來保護此全局語言環境,以防止線程之間的同時訪問導致不良行爲。由於目前的標準並沒有明確地處理線程,所以這是一個集合的實現選擇,關於如何(或者如果)這個鎖定機制是否被實現以及是否需要其他共享數據和鎖。

1

答案可能是延遲初始化。有很多的語言環境系統背後的數據,這是很容易使編碼序列的錯誤:

  1. 採取鎖
  2. 檢查初始化
  3. 讀取數據,如果需要
  4. 釋放鎖

,並有你。

我們中有些人不相信整個iostream的機制,只要我們可以從一個線程性能的角度來看它扔。因爲,哦,1987年,它已經完全沒有辦法不必要的鎖來聲明一個單一的數據流將在一個線程中才能使用。