QAtomicScopedValueRollback Class

template <typename T> class QAtomicScopedValueRollback

원자 변수에 대해 QScopedValueRollback 을 제공합니다. 더 보기...

헤더: #include <QAtomicScopedValueRollback>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
이후: Qt 6.7

공용 함수

QAtomicScopedValueRollback(QBasicAtomicInteger<T> &var, std::memory_order mo = std::memory_order_seq_cst)
QAtomicScopedValueRollback(QBasicAtomicPointer<std::remove_pointer_t<T>> &var, std::memory_order mo = std::memory_order_seq_cst)
QAtomicScopedValueRollback(std::atomic<T> &var, std::memory_order mo = std::memory_order_seq_cst)
QAtomicScopedValueRollback(QBasicAtomicInteger<T> &var, T value, std::memory_order mo = std::memory_order_seq_cst)
QAtomicScopedValueRollback(QBasicAtomicPointer<std::remove_pointer_t<T>> &var, T value, std::memory_order mo = std::memory_order_seq_cst)
QAtomicScopedValueRollback(std::atomic<T> &var, T value, std::memory_order mo = std::memory_order_seq_cst)
~QAtomicScopedValueRollback()
void commit()

상세 설명

QAtomicScopedValueRollback 클래스는 소멸 시 원자 변수를 이전 값으로 리셋합니다. 이 클래스는 예외가 발생했을 때 try-catch 블록을 작성할 필요 없이 상태를 되돌릴 때 사용할 수 있습니다.

재진입 가드와 같이 일시적으로 설정된 변수를 관리하는 데에도 사용할 수 있습니다. 이 클래스를 사용하면 함수가 정상적으로 종료되든, 반환 문에 의해 조기 종료되든, 예외에 의해 종료되든 변수가 재설정됩니다.

이 클래스는 std::atomic과 Qt 원자 클래스에서 작동합니다: QBasicAtomicInteger, QAtomicInteger, QAtomicInt, QBasicAtomicPointer 및 QAtomicPointer 에서 작동합니다.

원자 변수 var 에 대한 메모리 액세스는 mo 의 값을 사용하여 지정됩니다. 메모리 순서는 이 매핑을 따릅니다:

  • 원자 변수에 쓸 때:
    • 획득 순서는 대신 완화된 연산을 수행합니다.
    • 하이브리드 획득-해제 순서는 대신 해제 연산을 수행합니다.
  • 원자 변수에서 읽을 때:
    • 릴리스 오더가 대신 완화된 연산을 수행합니다.
    • 소비 순서는 소비 연산을 수행합니다.
    • 하이브리드 획득-해제 순서는 대신 획득 연산을 수행합니다.


그렇지 않으면 기본 메모리 순서는 순차적 일관 순서가 사용됩니다.

참고: 템플릿 인수의 이름을 명시적으로 지정하지 말고 클래스 템플릿 인수 공제(CTAD)만 사용하고 컴파일러가 템플릿 인수를 선택하도록 하세요.

참고: 다른 스레드에서도 변수를 수정할 가능성이 있으므로 QAtomicScopedValueRollback 생성자 호출과 commit() 사이 또는 commit()와 소멸자 사이에서 다른 스레드에서 수행한 업데이트가 손실될 수 있습니다.

QScopedValueRollback도 참조하십시오 .

멤버 함수 문서

[explicit constexpr] QAtomicScopedValueRollback::QAtomicScopedValueRollback(QBasicAtomicInteger<T> &var, std::memory_order mo = std::memory_order_seq_cst)

[explicit constexpr] QAtomicScopedValueRollback::QAtomicScopedValueRollback(QBasicAtomicPointer<std::remove_pointer_t<T>> &var, std::memory_order mo = std::memory_order_seq_cst)

[explicit constexpr] QAtomicScopedValueRollback::QAtomicScopedValueRollback(std::atomic<T> &var, std::memory_order mo = std::memory_order_seq_cst)

파괴 시 복원하기 위해 var 값을 기록합니다.

이는 다음과 같습니다:

T old_value = var.load(mo);
// And in the destructor: var.store(old_value, mo);

mo 로드에 대한 조정은 Memory Order 섹션에 설명되어 있습니다.

[explicit constexpr] QAtomicScopedValueRollback::QAtomicScopedValueRollback(QBasicAtomicInteger<T> &var, T value, std::memory_order mo = std::memory_order_seq_cst)

[explicit constexpr] QAtomicScopedValueRollback::QAtomicScopedValueRollback(QBasicAtomicPointer<std::remove_pointer_t<T>> &var, T value, std::memory_order mo = std::memory_order_seq_cst)

[explicit constexpr] QAtomicScopedValueRollback::QAtomicScopedValueRollback(std::atomic<T> &var, T value, std::memory_order mo = std::memory_order_seq_cst)

valuevar 에 할당하고 파괴 시 되돌리기 위해 내부적으로 var 의 이전 값을 저장합니다.

이는 다음과 같습니다:

T old_value = var.exchange(new_value, mo);
// And in the destructor: var.store(old_value, mo);

QAtomicScopedValueRollback::~QAtomicScopedValueRollback()

생성 시점 또는 commit()를 마지막으로 호출했을 때 현재 저장된 값을 관리 변수로 복원합니다.

이는 다음과 같습니다:

// In the constructor: T old_value = var.load(mo);
// or: T old_value = exchange(new_value, mo);
var.store(old_value, mo);

여기서 mo 은 처음에 생성자에 전달된 것과 동일합니다. mo 의 의미는 Memory Order 을 참조하세요.

void QAtomicScopedValueRollback::commit()

저장된 값을 생성 시와 동일한 메모리 순서로 로드된 관리 변수의 현재 값으로 업데이트합니다.

이 업데이트된 값은 소멸 시 원래의 이전 값 대신 복원됩니다.

이는 다음과 같습니다:

// Given constructor: T old_value = var.load(mo);
old_value = var.load(mo);  // referesh it
// And, in the destructor: var.store(old_value, mo);

여기서 mo 은 처음에 생성자에 전달된 것과 동일합니다. mo 의 의미는 Memory Order 을 참조하세요.

© 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.