java - 스핀 잠금 및 뮤텍스 잠금을 이해하는 방법은 무엇입니까?
给我你的怀抱
给我你的怀抱 2017-06-14 10:51:20
0
3
775

온라인에서 많은 기사를 읽었지만 여전히 혼란스럽습니다. 이 두 개념을 이해하기 쉽게 설명해 주실 수 있나요?

파이썬 멀티스레드 코딩에서는 보통 스레드의 run 메소드에서 while True 무한 루프를 사용한 뒤, 무한 루프의 루프 본문 끝에서 queue.task_done을 호출하여 큐를 제거한 다음, 큐의 메인 스레드는 메인 스레드가 직접 종료되는 것을 방지합니다. 이 멀티 스레드 코딩 방법이 합리적입니까? 버그가 있을까요? 추가적으로 제가 실행에서 호출하는 무한루프를 스핀락이라고 부르는지 여쭤보고 싶습니다.

给我你的怀抱
给我你的怀抱

모든 응답 (3)
小葫芦

먼저 뮤텍스 잠금이 무엇인지, 그 의미가 무엇인지 이해해야 합니다.
두 스레드 A와 B가 동일한 메모리에 액세스하는 경우입니다.
이상적으로는 A가 완전히 실행된 후 B가 실행되어야 합니다. 그러나 실행은 CPU 명령 시간을 차지하며, A가 절반만 실행되면 B가 CPU를 차지합니다. B가 이 메모리를 처리하기 위해 실행을 완료하고 A가 다시 CPU를 가져오면 메모리 데이터가 잘못된 것 아닌가요?
메모리 데이터 보안을 위해. 상호 배타적 기술이 사용됩니다. A가 이 메모리에 액세스하면 먼저 이 메모리에 사용 중인 플래그(잠금)가 있는지 확인하고, 그렇지 않은 경우 이 메모리에 플래그(잠금)를 추가합니다. 메모리, A는 처리 후 잠금을 해제합니다. A가 메모리를 처리하는 동안 B가 액세스하면 B는 이 메모리에 사용 중 표시(잠금)가 있고 B는 여러 동작을 가질 수 있다는 것을 알게 됩니다. 동작 1: CPU를 점유합니다. 잠금 상태를 지속적으로 반복하고 테스트합니다. 스레드는 중단(휴면)되지 않고 바쁜 대기 상태에 있습니다. 이러한 동작을 채택하는 잠금을 스핀 잠금이라고 합니다. 동작 2: 스레드 B는 잠자기 상태에서 차단되어 A가 실행을 마치고 잠금이 사라질 때까지 CPU를 포기한 다음 메모리를 사용합니다. 이 동작을 뮤텍스 잠금이라고 합니다. 이것을 본 후에는 잠금이 상호 배제를 구현하는 동기화 메커니즘이라는 것을 이해하게 될 것입니다. 스핀 잠금은 단지 뮤텍스 잠금의 경우입니다(대기하는 동안 CPU의 뮤텍스 잠금을 차지합니다).
이름에 속지 마세요. 그 뒤에 숨은 메커니즘을 이해하려면 이름을 바꿔도 이해해야 합니다,
참조 링크 링크 설명

    过去多啦不再A梦

    1. Python 다중 스레드 실행 방법에서 while 루프를 사용할 때 루프 본문에서 중지 프로그램 메커니즘을 사용하지 않으면 계속 실행됩니다. 따라서 포스터가 올바르게 코딩하려면 다음을 사용할 수 있습니다. 루프 본문에 알리는 세마포어 또는 기타 변수 메커니즘. 대기열이 비어 있는지 확인하거나, 비어 있으면 직접 중단하고 루프를 종료합니다.

    2. 실행 중인 무한 루프는 스핀 잠금이 아닙니다. 루프 내에서 리소스 경쟁이 있으면 잠금이 추가되지만 이 잠금도 상호 배제 잠금입니다.
    Python의 잠금은 스핀록이 아닌 세마포어를 사용합니다.

    으아악

    스핀 잠금: 여러 스레드가 동시에 동일한 리소스에 액세스합니다. 이는 일관성 없는 리소스 읽기 및 수정을 방지하기 위해 설정된 잠금입니다. 스레드가 리소스에 액세스할 때 스레드가 이미 리소스를 점유하고 있는 경우 후자의 스레드는 대기합니다. 이때 후자는 (휴면 없이) 전자가 점유한 리소스가 해제되었는지 여부를 감지하기 위해 CPU를 계속 실행합니다. 후자는 자원 점유에 액세스하고 지속적으로 감지하는 메커니즘입니다. .

    Mutex 잠금: 스핀 잠금과 목적은 동일하지만 메커니즘이 다릅니다. 스레드가 리소스를 점유하면 잠금이 추가됩니다. 후자의 스레드가 리소스에 액세스하면 리소스가 점유되어 있기 때문에 절전 상태로 들어갑니다. , 리소스가 해제될 때까지 기다립니다. 마지막으로 대기 중인 스레드에 세마포어를 통해 알립니다.

      过去多啦不再A梦

      이 프로세스에 따라 Python 코드가 실행됩니다.

      1. GIL 설정

      2. 특정 스레드로 전환

      3. 달려

      4. 스레드가 종료되고 절전 상태로 설정됩니다

      5. GIL 잠금 해제

      6. 위 작업을 반복하세요

      GIL 때문인지 파이썬에서는 스핀 잠금을 본 적이 없는 것 같고, 뮤텍스 잠금을 주로 사용합니다.

      다음은 제가 멀티스레딩을 작성할 때 사용한 방법입니다 참고용으로만 사용하세요~

      으아악

      큐이기 때문에 Queue의 Queue().get()에서는 큐에서 항목을 제거하고 반환하는 방법을 설명합니다.

        최신 다운로드
        더>
        웹 효과
        웹사이트 소스 코드
        웹사이트 자료
        프론트엔드 템플릿
        회사 소개 부인 성명 Sitemap
        PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!