재진입 뮤텍스

Reentrant mutex

컴퓨터 과학에서 재진입 뮤텍스(재귀적 뮤텍스, 재귀적 잠금)는 교착 상태를 일으키지 않고 동일한 프로세스/스레드에 의해 여러 번 잠길 수 있는 특정 유형의 상호 제외(뮤텍스) 장치입니다.

일반 뮤텍스(잠금)에서 "잠금" 작업을 수행하려고 하면 이미 뮤텍스가 잠겨 있을 때 실패하거나 차단되지만 재귀 뮤텍스에서는 잠금 스레드가 이미 잠금을 유지하고 있는 경우에만 이 작업이 성공합니다.일반적으로 재귀 뮤텍스는 잠긴 횟수를 추적하며 다른 스레드에서 잠글 수 있기 전에 동일한 수의 잠금 해제 작업을 수행해야 합니다.

동기

재귀 뮤텍스는 일반 뮤텍스를 사용하여 비재귀 문제를 해결합니다.잠금 기능을 사용하여 콜백을 실행하는 함수 자체가 콜백에 의해 호출되면 교착 상태가 발생합니다.[1]의사 코드의 경우는, 다음과 같은 상황이 됩니다.

var m : Mutex // 비재귀 뮤텍스.처음에는 잠금이 해제됩니다.함수 lock_and_call(i : 정수) m.lock() callback(i) m.unlock() 함수 콜백(i : Integer) i > 0 lock_and_call(i - 1) lock_and_call(1) // 함수 호출

이러한 정의가 주어지면 함수는lock_and_call(1)을 지정하면 다음 일련의 이벤트가 발생합니다.

  • m.lock() : 뮤텍스 잠금
  • 콜백(1)
  • lock_and_call(0): i >0 이므로
  • m.lock() : 교착상태.m이 이미 잠겨 있기 때문에 실행 스레드가 차단되어 자신을 기다립니다.

mutex를 재귀적인 것으로 치환하면 최종 m.lock()은 블로킹 없이 성공하기 때문에 문제가 해결됩니다.

실용화

W. Richard Stevens는 재귀 잠금이 올바르게 사용하기에 "기타 솔루션이 불가능할 만" API를 변경하지 않고 단일 스레드 코드를 적용할 것을 권장합니다.[2]

Java 언어의 기본 동기화 메커니즘모니터는 재귀 잠금을 사용합니다.통사적으로 잠금이란 'synchronized' 키워드가 앞에 있고 괄호 안에 있는 오브젝트 참조가 뮤텍스로 사용되는 코드 블록입니다.동기화된 블록 내에서 지정된 오브젝트는 wait(), notify() 또는 notifyAll()을 실행하여 조건변수로 사용할 수 있습니다.따라서 모든 개체는 재귀 뮤텍스 및 조건 [3]변수입니다.

  1. 스레드 A가 계속 진행하기 전에 스스로 재진입 잠금을 취득하는 함수 F를 호출합니다.
  2. 스레드 B가 함수 F를 호출합니다.이 함수는 재진입 잠금을 취득하려고 하지만 이미 미결 상태이기 때문에 취득할 수 없기 때문에 블록(대기 중) 또는 요청 시 타임아웃이 발생합니다.
  3. 스레드 A의 F는 자신을 재귀적으로 호출합니다.이미 잠금을 소유하고 있기 때문에 자신을 차단하지 않습니다(데드록 없음).이것이 재진입 뮤텍스의 중심 개념이며, 이것이 일반 잠금과 다른 점입니다.
  4. 스레드 B의 F가 아직 대기 중이거나 타임아웃을 검출하여 대처하고 있습니다.
  5. 스레드 A의 F가 잠금을 종료하고 해제합니다.
  6. 스레드 B의 F는 이제 재진입 잠금을 획득하여 대기 중인 경우 계속 진행할 수 있습니다.

소프트웨어 에뮬레이션

소프트웨어 에뮬레이션은 다음 [citation needed]구조를 사용하여 실행할[clarification needed] 수 있습니다.

  • 일반 잠금을 사용한 "제어" 상태
  • 각 스레드에 고유한 소유자 식별자(기본값은 비어 있음/설정되지 않음)
  • 획득 횟수(기본값 0)

획득

  1. 제어 조건을 획득합니다.
  2. 현재 스레드가 아닌 소유자가 설정되어 있는 경우 제어 조건이 통지될 때까지 기다립니다(이 경우에도 조건이 해제됩니다).
  3. 소유자를 현재 스레드로 설정합니다.소유주 식별자는 취득자가 이미 소유주가 아닌 한 이 시점에서 이미 삭제되어야 한다.
  4. 획득 카운트를 늘립니다(새 소유자의 경우 항상 1이 됩니다).
  5. 제어 조건을 해제합니다.

풀어주다

  1. 소유자가 릴레이저라고 주장하는 제어 조건을 취득합니다.
  2. 수집 카운트를 감소시켜 카운트가 0보다 크거나 같음을 나타냅니다.
  3. 획득 카운트가 0인 경우 소유자 정보를 클리어하고 제어 조건을 통지합니다.
  4. 제어 조건을 해제합니다.

레퍼런스

  1. ^ Buschmann, Frank; Henney, Kevlin; Schmidt, Douglas C. (2007). Pattern-Oriented Software Architecture, A Pattern Language for Distributed Computing. John Wiley & Sons. p. 374. ISBN 9780470065303.
  2. ^ Stevens, W. Richard; Rago, Stephen A. (2013). Advanced Programming in the UNIX Environment. Addison-Wesley. p. 434.
  3. ^ David Hovemeyer. "Lecture 17: Java Threads, Synchronization". CS 365 - Parallel and Distributed Computing. Lecture notes, York College of Pennsylvania. Retrieved 4 June 2015.