QAtomicPointer Class
template <typename T> class QAtomicPointerQAtomicPointer 클래스는 포인터에 대한 플랫폼 독립적인 원자 연산을 제공하는 템플릿 클래스입니다. 더 보기...
Header: | #include <QAtomicPointer> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
- 상속된 멤버를 포함한 모든 멤버의 목록
- QAtomicPointer는 스레딩 클래스의 일부입니다.
공용 함수
QAtomicPointer(T *value = nullptr) | |
QAtomicPointer(const QAtomicPointer<T> &other) | |
T * | fetchAndAddAcquire(qptrdiff valueToAdd) |
T * | fetchAndAddOrdered(qptrdiff valueToAdd) |
T * | fetchAndAddRelaxed(qptrdiff valueToAdd) |
T * | fetchAndAddRelease(qptrdiff valueToAdd) |
T * | fetchAndStoreAcquire(T *newValue) |
T * | fetchAndStoreOrdered(T *newValue) |
T * | fetchAndStoreRelaxed(T *newValue) |
T * | fetchAndStoreRelease(T *newValue) |
T * | loadAcquire() const |
T * | loadRelaxed() const |
void | storeRelaxed(T *newValue) |
void | storeRelease(T *newValue) |
bool | testAndSetAcquire(T *expectedValue, T *newValue) |
bool | testAndSetOrdered(T *expectedValue, T *newValue) |
bool | testAndSetRelaxed(T *expectedValue, T *newValue) |
bool | testAndSetRelease(T *expectedValue, T *newValue) |
QAtomicPointer<T> & | operator=(const QAtomicPointer<T> &other) |
정적 공용 멤버
bool | isFetchAndAddNative() |
bool | isFetchAndAddWaitFree() |
bool | isFetchAndStoreNative() |
bool | isFetchAndStoreWaitFree() |
bool | isTestAndSetNative() |
bool | isTestAndSetWaitFree() |
매크로
상세 설명
정수에 대한 원자 연산에 대해서는 QAtomicInteger 클래스를 참조하십시오.
원자 연산은 중단 없이 완료되는 복잡한 연산입니다. QAtomicPointer 클래스는 포인터에 대한 원자 테스트-설정, 가져오기-저장, 가져오기-추가 기능을 제공합니다.
아토믹 API
메모리 순서 지정
QAtomicPointer는 원자 테스트-앤-셋, 페치-앤-스토어, 페치-앤-추가 함수에 대한 여러 구현을 제공합니다. 각 구현은 원자 명령어를 둘러싼 메모리 액세스가 프로세서에 의해 실행되는 방식을 설명하는 메모리 순서 지정 시맨틱을 정의합니다. 많은 최신 아키텍처는 순서 외 실행과 메모리 순서를 허용하므로 애플리케이션이 모든 프로세서에서 제대로 작동하려면 올바른 시맨틱을 사용해야 합니다.
- Relaxed - 메모리 순서가 지정되지 않아 컴파일러와 프로세서가 메모리 액세스를 자유롭게 재지정할 수 있습니다.
- 획득 - 원자 연산 이후의 메모리 액세스(프로그램 순서)는 원자 연산 전에 순서를 변경할 수 없습니다.
- 릴리스 - 원자 연산 이전의 메모리 액세스(프로그램 순서)는 원자 연산 후에 다시 순서를 바꿀 수 없습니다.
- 정렬됨 - 동일한 획득 및 해제 시맨틱이 결합되었습니다.
테스트 및 설정
QAtomicPointer의 현재 값이 예상 값인 경우, test-and-set 함수는 QAtomicPointer에 새 값을 할당하고 참을 반환합니다. 값이 not 같으면 이 함수는 아무 작업도 수행하지 않고 false를 반환합니다. 이 작업은 다음 코드와 동일합니다:
if (currentValue == expectedValue) { currentValue = newValue; return true; } return false;
testAndSetRelaxed(), testAndSetAcquire(), testAndSetRelease(), testAndSetOrdered() 등 4개의 테스트 및 설정 함수가 있습니다. 다양한 메모리 순서 지정 의미에 대한 설명은 위를 참조하세요.
가져오기 및 저장
원자 가져오기 및 저장 함수는 QAtomicPointer의 현재 값을 읽은 다음 새 값을 할당하여 원래 값을 반환합니다. 이 작업은 다음 코드와 동일합니다:
T *originalValue = currentValue; currentValue = newValue; return originalValue;
fetchAndStoreRelaxed(), fetchAndStoreAcquire(), fetchAndStoreRelease(), fetchAndStoreOrdered() 등 4개의 fetch-and-store 함수가 있습니다. 다양한 메모리 순서 지정 의미에 대한 설명은 위를 참조하세요.
가져오기 및 추가
원자 가져오기 및 추가 함수는 QAtomicPointer의 현재 값을 읽은 다음 주어진 값을 현재 값에 더하여 원래 값을 반환합니다. 이 작업은 다음 코드와 동일합니다:
T *originalValue = currentValue; currentValue += valueToAdd; return originalValue;
fetchAndAddRelaxed(), fetchAndAddAcquire(), fetchAndAddRelease(), fetchAndAddOrdered() 등 4개의 fetch-and-add 함수가 있습니다. 다양한 메모리 순서 지정 의미에 대한 설명은 위를 참조하세요.
Atomic API 기능 테스트
모든 프로세서에서 작동하는 플랫폼 독립적인 원자 API를 제공하는 것은 어려운 일입니다. QAtomicPointer에서 제공하는 API는 모든 프로세서에서 원자적으로 작동하도록 보장됩니다. 그러나 모든 프로세서가 QAtomicPointer에서 제공하는 모든 연산을 지원하는 것은 아니므로 프로세서에 대한 정보를 노출할 필요가 있습니다.
컴파일 시 다양한 매크로를 사용하여 하드웨어에서 어떤 기능이 지원되는지 확인할 수 있습니다. 이를 통해 하드웨어가 특정 연산을 항상 지원하는지, 가끔 지원하는지, 지원하지 않는지 알 수 있습니다. 매크로의 형식은 Q_ATOMIC_POINTER_OPERATION_IS_HOW_NATIVE입니다. OPERATION은 TEST_AND_SET, FETCH_AND_STORE, 또는 FETCH_AND_ADD 중 하나이며, HOW는 항상, 때때로 또는 NOT 중 하나입니다. 작업당 항상 정확히 하나의 매크로가 정의됩니다. 예를 들어 Q_ATOMIC_POINTER_TEST_AND_SET_IS_ALWAYS_NATIVE 이 정의되어 있으면 Q_ATOMIC_POINTER_TEST_AND_SET_IS_SOMETIMES_NATIVE 이나 Q_ATOMIC_POINTER_TEST_AND_SET_IS_NOT_NATIVE 도 정의되지 않습니다.
일정한 시간 내에 완료되는 연산을 대기 시간이 없는 연산이라고 합니다. 이러한 연산은 어떤 종류의 잠금이나 루프를 사용하여 구현되지 않습니다. 항상 지원되고 대기 없는 원자 연산의 경우, Qt는 Q_ATOMIC_POINTER_OPERATION_IS_WAIT_FREE와 더불어 Q_ATOMIC_POINTER_OPERATION_IS_ALWAYS_NATIVE를 정의합니다.
원자 연산이 최신 세대의 프로세서에서만 지원되는 경우, QAtomicPointer는 isTestAndSetNative(), isFetchAndStoreNative() 및 isFetchAndAddNative() 함수를 사용하여 하드웨어가 지원하는 것을 런타임에 확인할 수 있는 방법도 제공합니다. 대기 없는 구현은 isTestAndSetWaitFree(), isFetchAndStoreWaitFree() 및 isFetchAndAddWaitFree() 함수를 사용하여 감지할 수 있습니다.
아래는 QAtomicPointer에 대한 모든 기능 매크로의 전체 목록입니다:
- Q_ATOMIC_POINTER_TEST_AND_SET_IS_ALWAYS_NATIVE
- Q_ATOMIC_POINTER_TEST_AND_SET_IS_SOMETIMES_NATIVE
- Q_ATOMIC_POINTER_TEST_AND_SET_IS_NOT_NATIVE
- Q_ATOMIC_POINTER_TEST_AND_SET_IS_WAIT_FREE
- Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_ALWAYS_NATIVE
- Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_SOMETIMES_NATIVE
- Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_NOT_NATIVE
- Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_WAIT_FREE
- Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_ALWAYS_NATIVE
- Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_SOMETIMES_NATIVE
- Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_NOT_NATIVE
- Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_WAIT_FREE
QAtomicInteger 및 qYieldCpu()도 참조하세요 .
멤버 함수 문서
[constexpr noexcept]
QAtomicPointer::QAtomicPointer(T *value = nullptr)
주어진 value 로 QAtomicPointer를 생성합니다.
[noexcept]
QAtomicPointer::QAtomicPointer(const QAtomicPointer<T> &other)
other 의 복사본을 생성합니다.
T *QAtomicPointer::fetchAndAddAcquire(qptrdiff valueToAdd)
원자 가져오기 및 추가.
QAtomicPointer 의 현재 값을 읽은 다음 valueToAdd 을 현재 값에 더하여 원래 값을 반환합니다.
이 함수는 획득 memory ordering 시맨틱을 사용하여 원자 연산 이후의 메모리 액세스(프로그램 순서대로)가 원자 연산 이전에 다시 정렬되지 않도록 합니다.
T *QAtomicPointer::fetchAndAddOrdered(qptrdiff valueToAdd)
원자 가져오기 및 추가.
QAtomicPointer 의 현재 값을 읽은 다음 valueToAdd 을 현재 값에 더하여 원래 값을 반환합니다.
이 함수는 정렬된 memory ordering 시맨틱을 사용하므로 원자 연산 전후의 메모리 액세스(프로그램 순서대로)가 다시 정렬되지 않을 수 있습니다.
T *QAtomicPointer::fetchAndAddRelaxed(qptrdiff valueToAdd)
원자 가져오기 및 추가.
QAtomicPointer 의 현재 값을 읽은 다음 valueToAdd 을 현재 값에 더하여 원래 값을 반환합니다.
이 함수는 컴파일러와 프로세서가 메모리 액세스 순서를 자유롭게 재지정할 수 있도록 완화된 memory ordering 시맨틱을 사용합니다.
T *QAtomicPointer::fetchAndAddRelease(qptrdiff valueToAdd)
원자 가져오기 및 추가.
QAtomicPointer 의 현재 값을 읽은 다음 valueToAdd 을 현재 값에 더하여 원래 값을 반환합니다.
이 함수는 릴리스 memory ordering 시맨틱을 사용하여 원자 연산 이전의 메모리 액세스(프로그램 순서대로)가 원자 연산 이후에 다시 정렬되지 않도록 합니다.
T *QAtomicPointer::fetchAndStoreAcquire(T *newValue)
원자 가져오기 및 저장.
이 QAtomicPointer 의 현재 값을 읽은 다음 newValue 에 할당하여 원래 값을 반환합니다.
이 함수는 획득 memory ordering 시맨틱을 사용하여 원자 연산 이후의 메모리 액세스(프로그램 순서대로)가 원자 연산 전에 다시 정렬되지 않도록 합니다.
T *QAtomicPointer::fetchAndStoreOrdered(T *newValue)
원자 가져오기 및 저장.
이 QAtomicPointer 의 현재 값을 읽은 다음 newValue 에 할당하여 원래 값을 반환합니다.
이 함수는 정렬된 memory ordering 시맨틱을 사용하므로 원자 연산 전후의 메모리 액세스(프로그램 순서대로)가 다시 정렬되지 않을 수 있습니다.
T *QAtomicPointer::fetchAndStoreRelaxed(T *newValue)
원자 가져오기 및 저장.
QAtomicPointer 의 현재 값을 읽은 다음 newValue 에 할당하여 원래 값을 반환합니다.
이 함수는 컴파일러와 프로세서가 메모리 액세스 순서를 자유롭게 재지정할 수 있도록 완화된 memory ordering 시맨틱을 사용합니다.
T *QAtomicPointer::fetchAndStoreRelease(T *newValue)
원자 가져오기 및 저장.
이 QAtomicPointer 의 현재 값을 읽은 다음 newValue 에 할당하여 원래 값을 반환합니다.
이 함수는 릴리스 memory ordering 시맨틱을 사용하여 원자 연산 이전의 메모리 액세스(프로그램 순서대로)가 원자 연산 이후에 다시 정렬되지 않도록 합니다.
[static constexpr]
bool QAtomicPointer::isFetchAndAddNative()
가져오기 및 추가가 원자 프로세서 명령어를 사용하여 구현되면 true
을 반환하고, 그렇지 않으면 false를 반환합니다.
[static constexpr]
bool QAtomicPointer::isFetchAndAddWaitFree()
원자 가져오기 및 추가가 대기 시간이 없는 경우 true
을 반환하고, 그렇지 않으면 false 를 반환합니다.
[static constexpr]
bool QAtomicPointer::isFetchAndStoreNative()
가져오기 및 저장이 원자 프로세서 명령어를 사용하여 구현된 경우 true
을 반환하고, 그렇지 않으면 false를 반환합니다.
[static constexpr]
bool QAtomicPointer::isFetchAndStoreWaitFree()
원자 가져오기 및 저장이 대기 시간이 없는 경우 true
을 반환하고, 그렇지 않으면 거짓을 반환합니다.
[static constexpr]
bool QAtomicPointer::isTestAndSetNative()
테스트 및 설정이 원자 프로세서 명령어를 사용하여 구현된 경우 true
을 반환하고, 그렇지 않으면 false를 반환합니다.
[static constexpr]
bool QAtomicPointer::isTestAndSetWaitFree()
원자 테스트 및 설정이 대기 시간이 없는 경우 true
을 반환하고, 그렇지 않으면 거짓을 반환합니다.
T *QAtomicPointer::loadAcquire() const
'획득' 메모리 순서를 사용하여 QAtomicPointer 값을 원자적으로 로드합니다. 이 값은 어떤 방식으로도 수정되지 않지만 그대로 유지된다는 보장은 없습니다.
storeRelease() 및 loadRelaxed()도 참조하세요 .
T *QAtomicPointer::loadRelaxed() const
완화된 메모리 순서를 사용하여 이 QAtomicPointer 값을 원자적으로 로드합니다. 이 값은 어떤 방식으로도 수정되지 않지만 그대로 유지된다는 보장은 없습니다.
storeRelaxed() 및 loadAcquire()도 참조하세요 .
void QAtomicPointer::storeRelaxed(T *newValue)
완화된 메모리 순서를 사용하여 newValue 값을 이 원자 유형에 원자적으로 저장합니다.
storeRelease() 및 loadRelaxed()도 참조하세요 .
void QAtomicPointer::storeRelease(T *newValue)
"릴리스" 메모리 순서를 사용하여 newValue 값을 이 원자 유형에 원자적으로 저장합니다.
storeRelaxed() 및 loadRelaxed()도 참조하세요 .
bool QAtomicPointer::testAndSetAcquire(T *expectedValue, T *newValue)
원자 테스트 및 설정.
이 QAtomicPointer 의 현재 값이 expectedValue 인 경우 테스트 및 설정 함수는 newValue 을 이 QAtomicPointer 에 할당하고 참을 반환합니다. 값이 같지 않으면 이 함수는 아무 작업도 수행하지 않고 false
을 반환합니다.
이 함수는 획득 memory ordering 시맨틱을 사용하여 원자 연산 이후의 메모리 액세스(프로그램 순서대로)가 원자 연산 전에 다시 정렬되지 않도록 합니다.
bool QAtomicPointer::testAndSetOrdered(T *expectedValue, T *newValue)
원자 테스트 및 설정.
이 QAtomicPointer 의 현재 값이 expectedValue 인 경우 테스트 및 설정 함수는 newValue 을 이 QAtomicPointer 에 할당하고 참을 반환합니다. 값이 같지 않으면 이 함수는 아무 작업도 수행하지 않고 false
을 반환합니다.
이 함수는 정렬된 memory ordering 시맨틱을 사용하므로 원자 연산 전후의 메모리 액세스(프로그램 순서대로)가 순서가 바뀌지 않을 수 있습니다.
bool QAtomicPointer::testAndSetRelaxed(T *expectedValue, T *newValue)
원자 테스트 및 설정.
이 QAtomicPointer 의 현재 값이 expectedValue 인 경우 테스트 및 설정 함수는 newValue 을 이 QAtomicPointer 에 할당하고 참을 반환합니다. 값이 같지 않으면 이 함수는 아무 작업도 수행하지 않고 false
을 반환합니다.
이 함수는 컴파일러와 프로세서가 메모리 액세스 순서를 자유롭게 재지정할 수 있도록 완화된 memory ordering 시맨틱을 사용합니다.
bool QAtomicPointer::testAndSetRelease(T *expectedValue, T *newValue)
원자 테스트 및 설정.
이 QAtomicPointer 의 현재 값이 expectedValue 인 경우 테스트 및 설정 함수는 newValue 을 이 QAtomicPointer 에 할당하고 참을 반환합니다. 값이 같지 않으면 이 함수는 아무 작업도 수행하지 않고 false
을 반환합니다.
이 함수는 릴리스 memory ordering 시맨틱을 사용하여 원자 연산 이전의 메모리 액세스(프로그램 순서대로)가 원자 연산 후에 다시 정렬되지 않도록 합니다.
[noexcept]
QAtomicPointer<T> &QAtomicPointer::operator=(const QAtomicPointer<T> &other)
other 을 이 QAtomicPointer 에 할당하고 이 QAtomicPointer 에 대한 참조를 반환합니다.
매크로 문서
Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_ALWAYS_NATIVE
이 매크로는 프로세서가 포인터에 대한 원자 가져오기 및 추가를 지원하는 경우에만 정의됩니다.
Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_NOT_NATIVE
이 매크로는 하드웨어가 포인터에 대한 원자 가져오기 및 추가를 지원하지 않을 때 정의됩니다.
Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_SOMETIMES_NATIVE
이 매크로는 특정 세대의 프로세서만 포인터에 대한 원자 가져오기 및 추가를 지원할 때 정의됩니다. QAtomicPointer::isFetchAndAddNative () 함수를 사용하여 프로세서가 무엇을 지원하는지 확인하세요.
Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_WAIT_FREE
이 매크로는 Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_ALWAYS_NATIVE 와 함께 정의되어 포인터에 대한 원자 가져오기 및 추가가 대기 시간이 없음을 나타냅니다.
Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_ALWAYS_NATIVE
이 매크로는 프로세서가 포인터에 대한 원자 가져오기 및 저장을 지원하는 경우에만 정의됩니다.
Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_NOT_NATIVE
이 매크로는 하드웨어가 포인터에 대한 원자 가져오기 및 저장을 지원하지 않을 때 정의됩니다.
Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_SOMETIMES_NATIVE
이 매크로는 특정 세대의 프로세서만 포인터에 대한 원자 가져오기 및 저장을 지원할 때 정의됩니다. QAtomicPointer::isFetchAndStoreNative () 함수를 사용하여 프로세서가 무엇을 지원하는지 확인하세요.
Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_WAIT_FREE
이 매크로는 Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_ALWAYS_NATIVE 와 함께 정의되어 포인터에 대한 원자 가져오기 및 저장이 대기 시간이 없음을 나타냅니다.
Q_ATOMIC_POINTER_TEST_AND_SET_IS_ALWAYS_NATIVE
이 매크로는 프로세서가 포인터에 대한 원자 테스트 및 설정을 지원하는 경우에만 정의됩니다.
Q_ATOMIC_POINTER_TEST_AND_SET_IS_NOT_NATIVE
이 매크로는 하드웨어가 포인터에 대한 원자 테스트 및 설정을 지원하지 않을 때 정의됩니다.
Q_ATOMIC_POINTER_TEST_AND_SET_IS_SOMETIMES_NATIVE
이 매크로는 특정 세대의 프로세서만 포인터에 대한 원자 테스트 및 설정을 지원할 때 정의됩니다. QAtomicPointer::isTestAndSetNative () 함수를 사용하여 프로세서가 무엇을 지원하는지 확인하세요.
Q_ATOMIC_POINTER_TEST_AND_SET_IS_WAIT_FREE
이 매크로는 Q_ATOMIC_POINTER_TEST_AND_SET_IS_ALWAYS_NATIVE 와 함께 정의되어 포인터에 대한 원자 테스트 및 설정이 대기 시간이 없음을 나타냅니다.
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.