이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 49134|회답: 4

[출처] .NET/C# 잠금 원칙 모니터가 심층적인 설명을 제공합니다

[링크 복사]
게시됨 2021. 4. 29. 오전 9:54:10 | | | |
lock 문은 주어진 객체의 뮤텍스를 받아 문장 블록을 실행한 후 락을 해제합니다. 자물쇠를 잡을 때, 자물쇠를 잡고 있는 나사가 다시 자물쇠를 획득하고 풀 수 있습니다. 다른 스레드는 잠금을 받을 수 없게 차단되어 잠금이 해제될 때까지 기다립니다.

복습:

.net/c# 사용자 다중 스레드 동시성 lock(string){...} 상세 설명
https://www.itsvse.com/thread-7764-1-1.html

잠금 코드를 사용해



Lock의 기본 코드는 Monitor에 의해 구현된 것으로 생각할 수 있습니다.

코드가 try... 따라서 Lock문 본문에 예외가 던져져도 락은 해제됩니다.

진술문 본문에 waitit operator lock을 사용할 수 없습니다.본문에서는 사용할 수 없습니다기다려오퍼레이터 락。 진술문 본문에 waitit operator lock을 사용할 수 없습니다. 진술문 본문에 waitit operator lock을 사용할 수 없습니다. 이 문장은 매우 중요합니다!

문서조사:하이퍼링크 로그인이 보입니다.

제가 직접 코드를 테스트해봅니다,Task를 사용해 자물쇠를 얻고 wait로 차단하는 데 사용하세요, 코드는 다음과 같습니다:

다음 코드를 여러 번 실행한 후, 실행 결과는 예상과 다르게 나옵니다.



왜? lock 블록에서 waitit 키워드를 사용할 때 await 키워드를 사용하려 하면 컴파일 오류가 발생합니다: lock 문의 본문에 wait 할 수 없습니다. 그 이유는 await이 완료된 후, 메서드가 await 키워드 이전의 스레드(호출 스레드) 대신 다른 스레드에서 실행될 수 있기 때문입니다.lockkeyword같은 스레드입니다잠금을 채우고 해제하는 자물쇠
코드를 수정하여 이유를 더 직관적으로 이해할 수 있도록 하세요:

자물쇠의 나사산 ID와 잠금 해제의 나사산 ID를 얻으세요,분명히 스레드에는 없어요따라서 아래 그림에서 보듯이 락을 성공적으로 해제할 수 없습니다:



코드를 수정해보고, 스레드로 테스트하고, 여러 번 실행했는데 기대대로 작동했습니다. 코드는 다음과 같습니다:



(끝)





이전의:(to).NET/C# 파일을 압축하기 위해
다음:Redis는 상세한 설명을 위해 Lua 스크립트를 사용합니다
 집주인| 게시됨 2022. 2. 10. 오전 9:20:09 |

자물쇠를 놓지 마세요





 집주인| 게시됨 2023. 6. 25. 오후 7:57:43 |
객체 동기화 메서드는 동기화되지 않은 코드 블록에서 호출되었습니다.
다음 코드는 위와 같은 오류를 일으킵니다




 집주인| 게시됨 2023. 8. 12. 오후 7:47:49 |
아래에 표시된 락 구문 슈가:






 집주인| 게시됨 2024. 7. 11. 오전 10:44:02 |
[Turn]C# 다중 스레드 동시성 여러 잠금 상태
https://www.itsvse.com/thread-10561-1-1.html
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com