std::atomic_fetch_sub, std::atomic_fetch_sub_explicit
![]() | Эта страница была переведена автоматически с английской версии вики используя Переводчик Google. Перевод может содержать ошибки и странные формулировки. Наведите курсор на текст, чтобы увидеть оригинал. Щёлкните здесь, чтобы увидеть английскую версию этой страницы. (Вы можете помочь в исправлении ошибок и улучшении перевода. Для инструкций перейдите по ссылке.) |
Определено в заголовочном файле <atomic> | ||
template<class Integral > Integral atomic_fetch_sub(std::atomic<Integral>* obj, Integral arg ); | (1) | (начиная с C++11) |
template<class Integral > Integral atomic_fetch_sub(volatilestd::atomic<Integral>* obj, Integral arg ); | (2) | (начиная с C++11) |
template<class Integral > Integral atomic_fetch_sub_explicit(std::atomic<Integral>* obj, Integral arg, | (3) | (начиная с C++11) |
template<class Integral > Integral atomic_fetch_sub_explicit(volatilestd::atomic<Integral>* obj, Integral arg, | (4) | (начиная с C++11) |
template<class T > T* atomic_fetch_sub(std::atomic<T*>* obj, std::ptrdiff_t arg ); | (5) | (начиная с C++11) |
template<class T > T* atomic_fetch_sub(volatilestd::atomic<T*>* obj, std::ptrdiff_t arg ); | (6) | (начиная с C++11) |
template<class T > T* atomic_fetch_sub_explicit(std::atomic<T*>* obj, std::ptrdiff_t arg, | (7) | (начиная с C++11) |
template<class T > T* atomic_fetch_sub_explicit(volatilestd::atomic<T*>* obj, std::ptrdiff_t arg, | (8) | (начиная с C++11) |
1-2) Atomically subtracts arg
from the value pointed to by obj
and returns the value obj
held previously, as if by obj->fetch_sub(arg)
3-4) Atomically subtracts arg
from the value pointed to by obj
and returns the value obj
held previously, as if by obj->fetch_sub(arg, order)
5-6) Atomically decrements the pointer value, pointed to by obj
, by arg
, and returns the value obj
held previously, as if by obj->fetch_sub(arg)
7-8) Atomically decrements the pointer value, pointed to by obj
, by arg
, and returns the value obj
held previously, as if by obj->fetch_sub(arg, order)
Содержание |
[править]Параметры
obj | — | Указатель на атомном объекте изменить Оригинал: pointer to the atomic object to modify Текст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. |
arg | — | Значение вычесть из значения, хранящиеся в атомном объекте Оригинал: the value to subtract from the value stored in the atomic object Текст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. |
order | — | памяти sycnhronization заказа для этой операции: все допустимые значения . Оригинал: the memory sycnhronization ordering for this operation: all values are permitted. Текст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. |
[править]Возвращаемое значение
obj
obj
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
[править]Исключения
[править]Возможная реализация
Первый вариант |
---|
template<class T >typenamestd::enable_if<std::is_integral<T>::value&&!std::is_same<T, bool>::value, T>::type atomic_fetch_sub(std::atomic<T>* obj, T arg );{return obj->fetch_sub(arg);} |
Второй вариант |
template<class T > T* atomic_fetch_sub(std::atomic<T*>* obj, std::ptrdiff_t arg){return obj->fetch_sub(arg);} |
[править]Пример
Multiple threads may use fetch_sub
to concurrently process an indexed container
#include <string>#include <thread>#include <vector>#include <iostream>#include <atomic>#include <numeric> constint N =10000;std::atomic<int> cnt;std::vector<int> data(N); void reader(int id){for(;;){int idx = atomic_fetch_sub_explicit(&cnt, 1, std::memory_order_relaxed);if(idx >=0){std::cout<<"reader "<<std::to_string(id)<<" processed item "<<std::to_string(data[idx])<<'\n';}else{std::cout<<"reader "<<std::to_string(id)<<" done\n";break;}}} int main(){std::iota(data.begin(), data.end(), 1); cnt = data.size()-1; std::vector<std::thread> v;for(int n =0; n <10;++n){ v.emplace_back(reader, n);}for(auto& t : v){ t.join();}}
Вывод:
reader 2 processed item 10000 reader 6 processed item 9994 reader 4 processed item 9996 reader 6 processed item 9992 <....> reader 0 done reader 5 done reader 3 done reader 9 done
[править]См. также
атомарно вычитает аргумент из значения, хранящегося в атомарном объекте, и получает значение, сохранённое ранее (public функция-элемент std::atomic ) | |
(C++11)(C++11) | добавляет неатомарное значение к атомарному объекту и получает предыдущее атомарное значение (шаблон функции) |
Документация C по atomic_fetch_sub, atomic_fetch_sub_explicit |