> 백엔드 개발 > C++ > 멀티 스레드 프로그래밍에서`lock (this)`가 위험한 이유는 무엇입니까?

멀티 스레드 프로그래밍에서`lock (this)`가 위험한 이유는 무엇입니까?

Patricia Arquette
풀어 주다: 2025-01-31 06:26:09
원래의
999명이 탐색했습니다.

: 다중 스레드 프로그래밍에서 숨겨진 위험을 피하십시오 Why is `lock(this)` Dangerous in Multithreaded Programming?
Microsoft 문서는

의 사용을 피하고 그 뒤에있는 이유와 잠재적 결과를 이해하기 위해 명확하게 권장됩니다.

통제되지 않은 잠금 문제 lock(this) 문제의 핵심은 다른 스레드가 동일한 객체를 잠글 수있는 다른 스레드를 제어하는 ​​것이 불가능하다는 것입니다. 이로 인해 여러 스레드가 서로 자물쇠가 풀리기를 기다릴 수 있습니다. 객체가 공개적으로 노출되었다고 가정하면 누구나 참조를 얻을 수 있습니다. 이러한 참조 중 하나라도 객체를 잠그는 데 사용되는 경우, 객체의 제작자는 그것에 대해 아무것도 알지 못할 수 있으며, 이는 병렬 실행을 복잡하게하고 사고 오류를 유발할 수 있습니다.

캡슐화를 파괴하고 선명도를 줄입니다 lock(this) 불법 포장 원리를 사용하여 잠금 메커니즘은 공개 액세스에 노출됩니다. 이로 인해 물체의 예상 사용과 동작을 이해하기가 어렵습니다. 반대로, 개인 필드를 고정하면주의 지점을 명확하게 분리하고 불필요한 구현 세부 사항에 노출되지 않고 내부적으로 잠그는 것을 보장 할 수 있습니다. 오해의 위험과 문자열

일부 오해는 실수로 의 사용에 기여했습니다. 한 가지 오해는 잠금 객체 자체가 객체의 변경 불가능하거나 수정을 피하는 방법이라는 것입니다. 이것은 사실이 아닙니다. 문으로 전달 된 매개 변수 객체는 잠금 객체를 식별하는 키를 식별하는 것입니다.

또 다른 함정은 문에서 문자열을 키로 사용하는 것입니다. 문자열은 변경되지 않고 응용 프로그램간에 공유 되므로이 접근 방식은 예상치 못한 잠금 충돌로 이어질 수 있습니다. 대신, 잠금 장치를 더 잘 제어하기 위해 개인 객체를 키로 사용하는 것이 가장 좋습니다.

사례 연구 : 병렬 처리의 스레드 보안

잠재적 인 문제를 설명하려면 다음 C#코드를 고려하십시오 :

.

주 메소드에서 여러 스레드를 생성하고 각 스레드는 객체에서 작업을 수행하려고합니다. 객체를 얻는 의 객체의 잠금을 사용하는 방법. 그러나 및 메소드는 물체를 직접 또는 간접적으로 잠그고

를 키로 사용하려고 시도합니다. 코드는 다른 스레드의 객체를 잠글 때 코드가 작업을 수행하려고 시도하기 때문에 예기치 않은 잠금 충돌과 데드 잠금 장치로 이어질 것입니다. (TimewArp 및 Namechaange 메소드는 잠금 장치를 사용 하고이 또는 person.name을 잠금 객체로 사용한다고 가정합니다. 원본 텍스트는 완전한 코드를 제공하지 않았습니다)

. 간단히 말해서 lock(this)를 사용하여 스레드 보안을 파괴하고 잠재적 교착 상태를 만듭니다. 개인 필드 포장 잠금 장치를 사용하고 문에서 개인 객체를 키로 사용하면보다 강력하고 신뢰할 수있는 스레드 동기화 방법을 제공 할 수 있습니다.

위 내용은 멀티 스레드 프로그래밍에서`lock (this)`가 위험한 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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