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 . 추가 고려 사항:
다음을 따르세요. 이 지침을 따르면 이동 가능하지 않은 뮤텍스를 사용하는 경우에도 이동 가능 클래스가 스레드로부터 안전한 상태를 유지할 수 있습니다.
위 내용은 이동 불가능한 뮤텍스가 있는 C 클래스를 이동 가능하고 스레드로부터 안전하게 만들 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!