std:: atomic_is_lock_free, ATOMIC_xxx_LOCK_FREE
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
헤더 파일에 정의됨
<atomic>
|
||
|
template
<
class
T
>
bool atomic_is_lock_free ( const volatile std:: atomic < T > * obj ) noexcept ; |
(1) | (C++11부터) |
|
template
<
class
T
>
bool atomic_is_lock_free ( const std:: atomic < T > * obj ) noexcept ; |
(2) | (C++11부터) |
|
#define ATOMIC_BOOL_LOCK_FREE /* unspecified */
#define ATOMIC_CHAR_LOCK_FREE /* unspecified */
|
(3) | (C++11부터) |
|
#define ATOMIC_CHAR8_T_LOCK_FREE /* unspecified */
|
(4) | (C++20부터) |
- 0 절대 lock-free가 아닌 내장 atomic 타입의 경우,
- 1 때때로 lock-free인 내장 atomic 타입의 경우,
- 2 항상 lock-free인 내장 atomic 타입의 경우.
목차 |
매개변수
| obj | - | 검사할 원자 객체에 대한 포인터 |
반환값
true 만약 * obj 가 lock-free atomic이면, false 그렇지 않으면.
참고 사항
std::atomic_flag 를 제외한 모든 원자적 타입은 락-프리 원자적 CPU 명령어를 사용하는 대신 뮤텍스나 다른 잠금 연산을 사용하여 구현될 수 있습니다. 원자적 타입은 때때로 락-프리일 수도 있습니다: 예를 들어, 특정 타입에 대해 일부 하위 아키텍처만 락-프리 원자적 접근을 지원하는 경우(예: x86-64의 CMPXCHG16B 명령어), 원자적 연산이 락-프리인지 여부는 런타임까지 알 수 없을 수 있습니다.
C++ 표준은 락 프리 원자 연산이 또한 주소 무관적이어야 한다고 권장하지만(필수는 아님), 즉 공유 메모리를 사용하는 프로세스 간 통신에 적합해야 합니다.
예제
#include <atomic> #include <iostream> #include <utility> struct A { int a[4]; }; 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'; }
가능한 출력:
std::atomic<A> is lock free? false std::atomic<B> is lock free? true
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 3249 | C++11 |
atomic_is_lock_free
가 포인터를 통해 명시되었으며,
이는 모호하고 유효하지 않은 포인터 값을 허용할 수 있었음 |
atomic 객체를 통해
명시됨 |
참고 항목
|
원자적 객체가 잠금 없는 방식인지 확인
(
std::atomic<T>
의
public member function)
|
|
|
(C++11)
|
잠금 없는 불리언 원자적 타입
(class) |
|
[static]
(C++17)
|
해당 타입이 항상 잠금 없는 방식임을 나타냄
(
std::atomic<T>
의
public static member constant)
|
|
(C++20에서 사용 중단됨)
(C++26에서 제거됨)
|
std::shared_ptr
에 대한 원자 연산을 특수화합니다
(함수 템플릿) |
|
C 문서
for
atomic_is_lock_free
|
|
|
C 문서
for
ATOMIC_*_LOCK_FREE
|
|