C++ Atomic Library - exchange



Description

It automically replaces the value of the atomic object with non-atomic argument and returns the old value of the atomic.

Declaration

Following is the declaration for std::atomic_exchange.

 template< class T > T atomic_exchange( std::atomic<T>* obj, T desr ); 

C++11

 template< class T > T atomic_exchange( volatile std::atomic<T>* obj, T desr ); 

Parameters

  • obj − It is used in pointer to the atomic object to modify.

  • desr − It is used to store the value in the atomic object.

  • order − It is used to synchronise the memory ordering for this operation.

Return Value

It returns the value held previously by the atomic object pointed to by obj.

Exceptions

No-noexcept − this member function never throws exceptions.

Example

In below example for std::atomic_exchange.

 #include <thread> #include <vector> #include <iostream> #include <atomic> std::atomic<bool> lock(false); void f(int n) { for (int cnt = 0; cnt < 100; ++cnt) { while(std::atomic_exchange_explicit(&lock, true, std::memory_order_acquire)) ; 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(); } } 

The output should be like this −

 Output from thread 0 Output from thread 1 Output from thread 0 Output from thread 1 Output from thread 0 Output from thread 1 Output from thread 0 Output from thread 1 ..................... 
atomic.htm
Advertisements