Difference between revisions of "cpp/atomic/atomic is lock free"
m (seealso is_always_lock_free) |
(+example) |
||
Line 51: | Line 51: | ||
===Example=== | ===Example=== | ||
− | {{example | + | {{example|code= |
− | + | #include <iostream> | |
− | + | #include <utility> | |
− | + | #include <atomic> | |
+ | |||
+ | struct A { int a[100]; }; | ||
+ | struct B { int x, y; }; | ||
+ | int main() | ||
+ | { | ||
+ | std::atomic<A> a; | ||
+ | std::atomic<B> b; | ||
+ | std::cout << std::boolalpha | ||
+ | << "std::atomic<A> is lock free? " | ||
+ | << std::atomic_is_lock_free(&a) << '\n' | ||
+ | << "std::atomic<B> is lock free? " | ||
+ | << std::atomic_is_lock_free(&b) << '\n'; | ||
+ | } | ||
+ | |p=true | ||
+ | |output= | ||
+ | std::atomic<A> is lock free? false | ||
+ | std::atomic<B> is lock free? true | ||
}} | }} | ||
Revision as of 05:18, 13 July 2016
Defined in header <atomic>
|
||
(1) | (since C++11) | |
template< class T > bool atomic_is_lock_free( const volatile std::atomic<T>* obj ); |
||
template< class T > bool atomic_is_lock_free( const std::atomic<T>* obj ); |
||
#define ATOMIC_BOOL_LOCK_FREE /* unspecified */ #define ATOMIC_CHAR_LOCK_FREE /* unspecified */ |
(2) | (since C++11) |
obj
is implemented lock-free, as if by calling obj->is_lock_free(). In any given program execution, the result of the lock-free query is the same for all pointers of the same type.- 0 for the built-in atomic types that are never lock-free
- 1 for the built-in atomic types that are sometimes lock-free
- 2 for the built-in atomic types that are always lock-free.
Contents |
Parameters
obj | - | pointer to the atomic object to examine |
Return value
true if *obj is a lock-free atomic, false otherwise.
Exceptions
Notes
All atomic types except for std::atomic_flag may be implemented using mutexes or other locking operations, rather than using the lock-free atomic CPU instructions. Atomic types are also allowed to be sometimes lock-free, e.g. if only aligned memory accesses are naturally atomic on a given architecture, misaligned objects of the same type have to use locks.
The C++ standard recommends (but does not require) that lock-free atomic operations are also address-free, that is, suitable for communication between processes using shared memory.
Example
#include <iostream> #include <utility> #include <atomic> struct A { int a[100]; }; struct B { int x, y; }; int main() { std::atomic<A> a; std::atomic<B> b; std::cout << std::boolalpha << "std::atomic<A> is lock free? " << std::atomic_is_lock_free(&a) << '\n' << "std::atomic<B> is lock free? " << std::atomic_is_lock_free(&b) << '\n'; }
Possible output:
std::atomic<A> is lock free? false std::atomic<B> is lock free? true
See also
checks if the atomic object is lock-free (public member function of std::atomic<T> )
| |
specializes atomic operations for std::shared_ptr (function template) | |
(C++11) |
the lock-free boolean atomic type (class) |
[static] (C++17) |
indicates that the type is always lock-free (public static member constant of std::atomic<T> )
|
C documentation for atomic_is_lock_free
| |
C documentation for ATOMIC_*_LOCK_FREE
|