2016-08-03 42 views
3

Bekanntlich gibt es Transactional Memory TS (ISO/IEC TS 19841: 2015) im experimentellen C++: Is it enough to declare a function as transaction_safe, so they can be used thread-safe?Warum sind ordnete std :: map und order std :: set nicht eingeladen, um transaction_safe zu machen?

Und operator[] als transaction_safe für Behälter nur erklärt: std::vector, std::unordered_map, std::unordered_multimap, std::unordered_set, std::unordered_multiset, std::deque - Taken von n4514: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4514.pdf

23,4 assoziative Container [assoziative]

23.4.4 Vorlage Klasse Karte [Karte]

23.4.4.1 Vorlage Klasse Kartenübersicht [map.overview]

In 23.4.4.1 [map.overview], fügen Sie "transaction_safe" zu den Erklärungen aller Varianten des Anfangs- und Endglied Funktionen und zu den Deklarationen von Größe, max_size und leer.

Aber warum ist nicht da operator[] als transaction_safe für std::map und std::set erklärt (aber es gibt für unordered_map/unordered_set)?

Und warum gibt es add „transaction_safe“ auf die Erklärungen aller Varianten der begin und end Mitgliederfunktionen für std::map und std::set?

Iteratoren begin und end sind sehr notwendig für die std::array, std::vector oder std::list, aber nicht für eine assoziative Array. In einem assoziativen Array erforderlich finden oder finden und ändern Funktionen: find, at, insert, erase und operator[]. Ohne sie macht es keinen Sinn.

Warum sind geordnete std :: map und ordered std :: set nicht eingeladen, transaction_safe zu machen?

+1

Ich vermute stark, dass das unconditional transaction-safe auf 'operator []' für 'unordered_meow' ein Defekt ist. –

Antwort

2

Das unordered_meow::operator[] wird als unbedingt transaktionssicher angegeben ist ein Fehler.

  • zu beginnen, unordered_set, unordered_multiset und unordered_multimap nicht einmal ein operator[] an erster Stelle haben.
  • unordered_map::operator[] müssen Hash und Pred aufrufen und möglicherweise Speicher zuweisen und ein neues Schlüssel/Wert-Paar erstellen; Keine davon ist notwendigerweise transaktionssicher.

Stattdessen map::operator[] ‚s Transaktionssicherheit durch die Zugabe geregelt [container.requirements.general]:

Sofern bedingungslos angegeben transaktionssicher sein, eine Funktion in diese Klausel Transaktion -safe, wenn alle erforderlichen Operationen transaktionssicher sind.[Hinweis: Dies umfasst Operationen für das Element Typ, auf std::allocator_traits, und auf Compare, Pred Objekte oder Hash Objekte, je nach der jeweiligen Funktion. - Endnote]