>백엔드 개발 >C++ >이동 불가능한 뮤텍스가 있는 C 클래스를 이동 가능하고 스레드로부터 안전하게 만들 수 있나요?

이동 불가능한 뮤텍스가 있는 C 클래스를 이동 가능하고 스레드로부터 안전하게 만들 수 있나요?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-05 19:22:18727검색

How Can I Make My C   Classes with Non-Movable Mutexes Both Movable and Thread-Safe?

C에서 이동 불가능한 뮤텍스를 사용한 스레드로부터 안전한 이동성

C에서 std::mutex와 같은 이동 가능한 유형을 처리하는 경우 스레드로부터 안전한 프로그래밍은 어려울 수 있습니다. 기본적으로 std::mutex는 이동 가능하거나 복사 가능하지 않으므로 스레드로부터 안전한 이동 가능한 객체 생성을 방해합니다.

뮤텍스가 포함된 클래스를 이동 가능하게 만들고 스레드 안전성을 유지하려면 다음 접근 방식을 고려하세요.

1. 가변성 활성화:
이동 작업 중에 수정이 가능하도록 뮤텍스 멤버를 가변 가능(예: 가변 std::mutex mut_;)으로 만듭니다.

2. 이동 생성자:
멤버를 할당하기 전에 이동 중인 개체의 뮤텍스를 잠급니다. 동시 접속으로 인한 데이터 손상을 방지합니다.

A(A&& a) {
    WriteLock rhs_lk(a.mut_);
    field1_ = std::move(a.field1_);
    field2_ = std::move(a.field2_);
}

3. 이동 할당 연산자:
동기화 프리미티브를 사용하여 이동 할당을 보호합니다. 여러 스레드에서 접근이 가능하므로 할당을 수행하기 전에 왼쪽(lhs) 및 오른쪽(rhs) 뮤텍스를 모두 잠그세요.

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;
}

4. 멤버 복사(선택 사항):
복사 멤버도 필요한 경우 ReadLock(WriteLock 대신)을 사용하여 복사되는 개체에서 동시 읽기를 허용합니다.

A(const A& a) {
    ReadLock rhs_lk(a.mut_);
    field1_ = a.field1_;
    field2_ = a.field2_;
}

5 . 추가 고려 사항:

  • 스레드 안전성을 유지하려면 적절한 동기화를 사용하여 클래스 상태에 액세스하는 다른 멤버 함수와 자유 함수를 보호하세요.
  • std::shared_timed_mutex 또는 다른 고급 동기화 사용을 고려하세요. C 14 이상의 특정 시나리오에 맞게 최적화하려면 유형을 입력하세요.

다음을 따르세요. 이 지침을 따르면 이동 가능하지 않은 뮤텍스를 사용하는 경우에도 이동 가능 클래스가 스레드로부터 안전한 상태를 유지할 수 있습니다.

위 내용은 이동 불가능한 뮤텍스가 있는 C 클래스를 이동 가능하고 스레드로부터 안전하게 만들 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.