Есть ли в C ++ 11 метод std :: atomic <T>:: add_and_fetch? - PullRequest
5 голосов
/ 25 января 2012

Стандарт C ++ 11 включает замечательный std::atomic<T>, который имеет функции-члены, подобные этой:

integral fetch_add(integral, memory_order = memory_order_seq_cst);

Однако, похоже, отсутствует метод add_fetch.tbb::atomic<T> перегружает оператор +=, чтобы вести себя как add_and_fetch:

 value_type operator+=( D addend ) {
     return fetch_and_add(addend)+addend;
 }

Посредством эмпирического наблюдения std::atomic<T> ведет себя так же, но я не могу найти, где это говорится в стандарте или еслиэто только моя реализация STL.Это поведение гарантировано стандартом?

Ответы [ 3 ]

5 голосов
/ 25 января 2012

Вы правы, что он на самом деле не предоставляет такую ​​функциональность, но это потому, что она не нужна.Его можно эмулировать с помощью операций, которые уже существуют .

atomic_fetch_add - это атомарная операция, которая выбирает текущее значение, а затем что-то добавляет.Это «что-то» полностью находится под вашим контролем и не изменяется atomic_fetch_add.

. Стандарт гарантирует, что:

  1. Возвращается старое значение;и
  2. Значение добавляется.

Затем вы можете просто самостоятельно добавить значение к тому, что было возвращено, и у вас будет текущее значение на момент выполнения атомарной операции.Итак, в основном:

def atomic_add_fetch (item, addendum):
    return atomic_fetch_add (item, addendum) + addendum

- это псевдокод для операции atomic_add_fetch.

4 голосов
/ 25 января 2012

std::atomic<T>, если T является целочисленным типом, имеет член operator+=, который делает то же самое. Он описан вместе со всеми другими операторами присваивания атомарных соединений в §29.6.5/30-32

C A :: operator op = (M операнд) volatile noexcept;

C A :: оператор op = (M операнд) noexcept;

Эффекты: fetch_key (операнд)

Возвращает: fetch_key (операнд), операнд

3 голосов
/ 25 января 2012

Однако, похоже, отсутствует метод add_fetch.

Зачем это нужно? add_fetch будет так:

return atomic_value.fetch_add(number) + number;

Да, технически это требует дополнительного дополнения. Но это довольно незначительно.

В любом случае в стандарте нет add_fetch. Там просто fetch_add, который возвращает исходное значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...