2016-08-03 46 views
3

已知有事務存儲器TS(ISO/IEC TS 19841:2015)在實驗C++:聲明爲transaction_safeIs it enough to declare a function as transaction_safe, so they can be used thread-safe?爲什麼訂購std :: map並且訂購std :: set沒有被邀請進行transaction_safe?

而且operator[]僅對容器:std::vectorstd::unordered_mapstd::unordered_multimapstd::unordered_setstd::unordered_multisetstd::deque - 兩者從n4514:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4514.pdf

23.4關聯容器[締]

23.4.4類模板地圖[圖]

23.4.4.1類模板地圖概述[map.overview]

在23.4.4.1 [map.overview],添加 「transaction_safe」 到聲明的開始和結束構件的所有變體的 函數和 聲明size,max_size和empty。

但爲什麼沒有宣佈operator[]作爲transaction_safestd::mapstd::set(但也有unordered_map/unordered_set)?

爲什麼有加「transaction_safe」爲std::mapstd::setbeginend成員函數的所有變量的聲明?

迭代beginend是非常必要的std::arraystd::vectorstd::list,但不能用於關聯數組。在關聯數組中需要find或find-and-modify函數:find,at,insert,eraseoperator[]。沒有他們,這是沒有道理的。

爲什麼訂購std :: map並且訂購std :: set沒有被邀請做transaction_safe?

+1

我強烈懷疑'unordered_meow'的'operator []'無條件的事務安全是一個缺陷。 –

回答

2

unordered_meow::operator[]被指定爲無條件交易安全是一個缺陷。

  • 首先,unordered_setunordered_multisetunordered_multimap甚至沒有擺在首位的operator[]
  • unordered_map::operator[]必須調用HashPred,並可能分配內存並構造一個新的鍵值對;這些都不一定是交易安全的。

相反,map::operator[]的交易安全是由除[container.requirements.general]支配:

除非無條件地規定爲交易安全,在 功能該章交易如果所有需要的操作都是 交易安全,則安全。[注意:這包括 類型的元素,std::allocator_traitsCompare,PredHash對象, 的操作,具體取決於各自的功能。 - end note]