교착 상태 찾기
멀티 스레딩 응용 프로그램을 프로그래밍 할 때는 공유 리소스에 액세스 할 때 다양한 스레드 교착 상태를 피하기 위해주의를 기울여야합니다. 교착 상태 스레드 시도는 다른 스레드가 먼저 잠근 리소스에 액세스하려고하는 동시에 다른 스레드에 잠겨 리소스에 액세스 할 때 발생합니다. 이것은 간단한 경우이지만 더 긴 리소스 체인으로 인해 더 복잡해질 수 있습니다.
도전
각 스레드가 액세스하는 리소스 목록에서 가능한 교착 상태 상황을 감지 할 수있는 프로그램이나 함수를 작성해야합니다. 이것은 코드 골프이므로 바이트 단위의 최단 답변이 이깁니다.
모든 스레드는 동시에 시작되지만 그 후에는 인터리빙의 모든 조합에서 실행될 수 있습니다. 4 개 작업을 각각 2 개 스레드가있는 경우, (각 번호는 해당 ID와 스레드 취한 조치 임)로 실행 될 수있는 1,1,1,1,2,2,2,2
, 2,2,2,2,1,1,1,1
, 1,2,1,2,1,2,1,2
, 1,1,2,2,2,2,1,1
, 또는 다른 가능한 조합.
입력
STDIN을 통해 함수 매개 변수 또는 가장 가까운 대안으로 문자열 목록을 수신합니다. 각 문자열은 형식 +a
-b
입니다. 이 문자열은 모두 스레드에 의해 리소스 의 잠금 ( +
) / 잠금 해제 ( -
)를 나타냅니다 . 모든 스레드 사이에는 ---
구분 기호 가 있습니다 . 스레드가 이미 잠근 리소스를 잠그려고 시도하지 않으며 모든 스레드가 종료하기 전에 잠근 모든 리소스를 명시 적으로 잠금 해제합니다. 다음은 설명하는 예입니다.
+a # Lock resource a
+b # Lock resource b
-a # Unlock resource a
-b # Unlock resource b
--- # Thread separator
+b # Lock resource b
-b # Unlock resource b
산출
입력에 교착 상태 가능성이 없으면 출력이 거짓이고, 교착 상태 상황이 포함되어 있으면 사실입니다. 예를 들면 다음과 같습니다.
true
false
1
0
모든 유효한 결과물이지만, 진실 / 거짓으로 명확하게 정의 된 것은 허용됩니다.
예
+a
-a
---
+a
-a
산출: false
+a
+b
-b
-a
---
+b
+a
-a
-b
산출 true
b,a
스레드마다 각각 획득하려고 할 때 교착 상태1,2
+a
+b
-a
-b
---
+a
+b
-b
-a
산출 false
+a
+b
-b
-a
---
+b
+c
-c
-b
---
+c
+a
-a
-c
산출: true
b,c,a
각각 1,2,3 스레드에서 교착 상태가 발생합니다 .
산출 false
산출 true
b,d,a
각각 획득하려고 할 때 스레드 1,2,3의 교착 상태 .
물론 이것은 더 많은 스레드, 더 많은 리소스 등으로 인해 훨씬 더 복잡해질 수 있지만 이러한 테스트는 기본 사항을 다루고 있다고 생각합니다.
보너스
프로그램을 작성할 때 교착 상태 상황을 발견하면 매우 슬프기 때문에 각각 출력에 대한 -8 바이트 보너스 :(
와 :)
진실 / 거짓으로 보너스가 있습니다.
d
나중에 리소스를 사용하려고 시도하지 않기 때문에이 방법이 설명 됩니다.
:)
은 거짓과 :(
진실을 위해해서는 안 됩니까?