2016-08-03 3 views
3

として、トランザクショナルメモリTS(ISO/IEC TS 19841:2015)がある既知の実験C++で:Is it enough to declare a function as transaction_safe, so they can be used thread-safe?なぜstd :: mapを注文し、std :: setを注文してtransaction_safeを作ることができないのですか?

そしてoperator[]transaction_safeとして宣言されたが、コンテナだけのために:std::vectorstd::unordered_mapstd::unordered_multimapstd::unordered_setstd::unordered_multisetstd::deque - 撮影http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4514.pdf

23.4連想コンテナ[連想]

23.4.4クラステンプレート・マップ:n4514から23.4.4.1 [map.overview]で[地図]

23.4.4.1クラステンプレート・マップの概要[map.overview]

、開始と終了メンバーのすべてのバリアントの宣言 に "transaction_safe" を追加サイズがmax_sizeで空であることを示す の宣言に適用されます。

しかし、なぜoperator[]std::mapためtransaction_safestd::setとして宣言(しかしunordered_map/unordered_setのためにそこにある)が存在しないのですか?

そして、なぜstd::mapstd::setためbeginendメンバー関数のすべてのバリアントの宣言に「transaction_safe」が追加されていますか?

begin

イテレータとendはなく連想配列のために、std::arraystd::vector又はstd::listために非常に必要です。 findatinserteraseoperator[]:連想配列で変更検索および検索または機能を必要としました。それらがなければ、意味をなさない。

はなぜのstd ::マップ命じたとstd ::を命じtransaction_safeを作るために招かないように設定されていますか? unordered_meow::operator[]は無条件にトランザクションセーフであることが指定されていることを

+1

'unordered_meow'の' operator [] 'に対する無条件のトランザクションセーフは欠陥であると強く思っています。 –

答えて

2

は欠陥です。

で開始する
  • unordered_setunordered_multisetunordered_multimapはそもそもoperator[]を持っていません。
  • unordered_map::operator[]HashPredを呼び出し、そしておそらくメモリを割り当てると、新しいキーと値のペアを構築する必要があります。これらのどれも、必ずしも取引に安全ではありません。無条件にトランザクションセーフであることを指定しない限り、 関数この句は、トランザクションで

    :代わりに、map::operator[]のトランザクションの安全性が[container.requirements.general]に添加することによって支配され

すべての必要な操作が トランザクションセーフである場合は安全です。[注:これには、 タイプの操作、std::allocator_traits、およびComparePred、またはHashオブジェクトの操作がそれぞれの機能によって異なります。 - end note]

関連する問題