std::atomic_exchange, std::atomic_exchange_explicit
Материал из cppreference.com
|
|
Эта страница была переведена автоматически с английской версии вики используя Переводчик Google. Перевод может содержать ошибки и странные формулировки. Наведите курсор на текст, чтобы увидеть оригинал. Щёлкните здесь, чтобы увидеть английскую версию этой страницы. (Вы можете помочь в исправлении ошибок и улучшении перевода. Для инструкций перейдите по ссылке.) |
<metanoindex/>
<tbody> </tbody>| Определено в заголовочном файле <atomic>
|
||
template< class T > T atomic_exchange( std::atomic<T>* obj, T desr ); |
(1) | (начиная с C++11) |
template< class T > T atomic_exchange( volatile std::atomic<T>* obj, T desr ); |
(2) | (начиная с C++11) |
template< class T > T atomic_exchange_explicit( std::atomic<T>* obj, T desr, std::memory_order order ); |
(3) | (начиная с C++11) |
template< class T > T atomic_exchange_explicit( volatile std::atomic<T>* obj, T desr, std::memory_order order ); |
(4) | (начиная с C++11) |
1-2)
Атомарно заменяет значение указывает
obj со значением desr и возвращает значение obj состоялась ранее, как по obj->exhange(desr)Оригинал:
Atomically replaces the value pointed to by
obj with the value of desr and returns the value obj held previously, as if by obj->exhange(desr)Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
3-4)
Атомарно заменяет значение указывает
obj со значением desr и возвращает значение obj состоялась ранее, как по obj->exhange(desr, order)Оригинал:
Atomically replaces the value pointed to by
obj with the value of desr and returns the value obj held previously, as if by obj->exhange(desr, order)Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Параметры
| obj | — | Указатель на атомном объекте изменить
Оригинал: pointer to the atomic object to modify Текст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. |
| desr | — | значение для хранения в атомном объекте
Оригинал: the value to store in the atomic object Текст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. |
| order | — | памяти sycnhronization заказа для этой операции: все допустимые значения .
Оригинал: the memory sycnhronization ordering for this operation: all values are permitted. Текст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. |
Возвращаемое значение
Значение состоялась ранее атомный объект, на который указывает
objОригинал:
The value held previously by the atomic object pointed to by
objТекст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Исключения
спецификация noexcept:
noexceptПример
Блокировкой мьютекса может быть реализован в пользовательском пространстве с помощью атомно-обменной операции, подобные atomic_flag_test_and_set
Оригинал:
A spinlock mutex can be implemented in userspace using an atomic exchange operation, similar to atomic_flag_test_and_set
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Запустить этот код
#include <thread>
#include <vector>
#include <iostream>
#include <atomic>
std::atomic<bool> lock = ATOMIC_VAR_INIT(false);
void f(int n)
{
for(int cnt = 0; cnt < 100; ++cnt) {
while(std::atomic_exchange_explicit(&lock, true, std::memory_order_acquire))
; // spin until acquired
std::cout << "Output from thread " << n << '\n';
std::atomic_store_explicit(&lock, false, std::memory_order_release);
}
}
int main()
{
std::vector<std::thread> v;
for (int n = 0; n < 10; ++n) {
v.emplace_back(f, n);
}
for (auto& t : v) {
t.join();
}
}
Вывод:
Output from thread 2
Output from thread 6
Output from thread 7
...<exactly 1000 lines>...
См. также
| атомарно заменяет значение атомарного объекта и получает ранее сохранённое значение (public функция-элемент std::atomic)
| |
| атомарно сравнивает значение атомарного объекта с неатомарным аргументом и выполняет атомарный обмен, если они равны, или атомарную загрузку, если нет (шаблон функции) | |
Специализируется атомарных операций для std::shared_ptr Оригинал: specializes atomic operations for std::shared_ptr Текст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. (шаблон функции) | |
Документация C по atomic_exchange, atomic_exchange_explicit
| |