Namespaces
Variants

std:: atomic_is_lock_free, ATOMIC_xxx_LOCK_FREE

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
atomic_is_lock_free
(C++11)
Free functions for atomic flags
헤더 파일에 정의됨 <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 */
#define ATOMIC_CHAR16_T_LOCK_FREE /* unspecified */
#define ATOMIC_CHAR32_T_LOCK_FREE /* unspecified */
#define ATOMIC_WCHAR_T_LOCK_FREE  /* unspecified */
#define ATOMIC_SHORT_LOCK_FREE    /* unspecified */
#define ATOMIC_INT_LOCK_FREE      /* unspecified */
#define ATOMIC_LONG_LOCK_FREE     /* unspecified */
#define ATOMIC_LLONG_LOCK_FREE    /* unspecified */

#define ATOMIC_POINTER_LOCK_FREE  /* unspecified */
(3) (C++11부터)
#define ATOMIC_CHAR8_T_LOCK_FREE  /* unspecified */
(4) (C++20부터)
1,2) obj 가 가리키는 원자적 객체가 락-프리 방식으로 구현되었는지 여부를 결정합니다. 이는 마치 obj - > is_lock_free ( ) 를 호출하는 것과 같습니다. 주어진 프로그램 실행에서, 동일한 타입의 모든 원자적 객체에 대한 락-프리 질의 결과는 동일합니다.
3,4) 정수 상수 표현식으로 확장되며 값은 다음과 같습니다:
  • 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)
잠금 없는 불리언 원자적 타입
(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