> 백엔드 개발 > C++ > `std::mutex`가 포함된 C 유형을 안전하게 이동하는 방법은 무엇입니까?

`std::mutex`가 포함된 C 유형을 안전하게 이동하는 방법은 무엇입니까?

Barbara Streisand
풀어 주다: 2024-11-30 08:11:10
원래의
821명이 탐색했습니다.

How to Safely Move C   Types Containing `std::mutex`?

이동 가능한 C 유형의 뮤텍스 처리

개요:

C에서 이동 의미 체계 강화 복사하지 않고도 유형을 효율적으로 이동할 수 있어 효율성이 향상됩니다. 그러나 표준 뮤텍스(std::mutex)는 이동 가능하거나 복사 가능하지 않으므로 뮤텍스를 활용하는 이동 가능 유형을 구현하는 데 어려움이 있습니다.

문제:

뮤텍스가 포함된 클래스(A)를 스레드로부터 안전한 환경에서 어떻게 이동 가능하게 만들 수 있습니까? 방식?

해결책:

이동성을 활성화하려면 잠금 유형(ReadLock 및 WriteLock)을 공유 잠금 또는 고유 잠금의 별칭으로 정의하세요. 이동 관련 작업 내에서 구성원 액세스를 보호하려면 이러한 유형을 활용하세요.

이동 생성자:

A(A&& a) {
    WriteLock rhs_lk(a.mut_);
    field1_ = std::move(a.field1_);
    field2_ = std::move(a.field2_);
}
로그인 후 복사

이동 할당 연산자:

A& operator=(A&& a) {
    if (this != &a) {
        WriteLock lhs_lk(mut_, std::defer_lock);
        WriteLock rhs_lk(a.mut_, std::defer_lock);
        std::lock(lhs_lk, rhs_lk);
        field1_ = std::move(a.field1_);
        field2_ = std::move(a.field2_);
    }
    return *this;
}
로그인 후 복사

복사 생성자:

A(const A& a) {
    ReadLock rhs_lk(a.mut_);
    field1_ = a.field1_;
    field2_ = a.field2_;
}
로그인 후 복사

복사 할당 연산자:

A& operator=(const A& a) {
    if (this != &a) {
        WriteLock lhs_lk(mut_, std::defer_lock);
        ReadLock rhs_lk(a.mut_, std::defer_lock);
        std::lock(lhs_lk, rhs_lk);
        field1_ = a.field1_;
        field2_ = a.field2_;
    }
    return *this;
}
로그인 후 복사

기타 고려 사항:

  • C에서 뮤텍스를 공유하여 복사 멤버를 최적화할 수 있습니다. 14.
  • 잠금 메커니즘을 사용하여 A의 상태를 수정하는 다른 메서드를 보호합니다.
  • 스왑 전에 동등성을 확인하여 자체 스왑을 방지하세요.
  • 읽기 및 사용을 고려하세요. 복사/이동 생성자의 기본 구성을 피하기 위해 잠금 데이터 멤버를 작성합니다.

위 내용은 `std::mutex`가 포함된 C 유형을 안전하게 이동하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿