Znalezienie impasu
Podczas programowania aplikacji wielowątkowej należy zachować ostrożność, aby uniknąć zakleszczenia różnych wątków podczas uzyskiwania dostępu do zasobów współużytkowanych. Impas występuje podczas próby nitki uzyskać dostęp do zasobu, który jest zamknięty w innym wątku w tym samym czasie, gdy inny wątek próbuje uzyskać dostęp do zasobu zablokowane przez pierwszą. Jest to prosty przypadek, ale może stać się bardziej złożony z dłuższymi łańcuchami zasobów.
Wyzwanie
Powinieneś napisać program lub funkcję, która może wykryć możliwą sytuację zakleszczenia na liście zasobów dostępnych dla każdego wątku. To jest golf golfowy, więc wygrywa najkrótsza odpowiedź w bajtach.
Każdy wątek jest uruchamiany w tym samym czasie, ale potem mogą działać przy dowolnej kombinacji przeplatania. W przypadku 2 gwinty 4 akcji każdy może być uruchamiany jako (z których każda jest to działanie podejmowane przez nić z tym 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
, albo jakąkolwiek inną możliwą kombinacją.
Wejście
Otrzymasz, poprzez STDIN, parametr funkcji lub najbliższą alternatywę, listę ciągów. Każdy ciąg będzie w formacie +a
-b
. Każdy z tych ciągów reprezentuje blokowanie ( +
) / odblokowywanie ( -
) zasobu przez wątek. Pomiędzy każdym wątkiem będzie ---
separator. Gwarantujemy, że wątek nie będzie próbował zablokować zasobu, który już zablokował, i że wszystkie wątki jawnie odblokują wszystkie zasoby, które zablokowały przed wyjściem. Oto przykład do zademonstrowania:
+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
Wynik
Dane wyjściowe powinny być fałszywe, jeśli dane wejściowe nie zawierają żadnej możliwości zakleszczenia, a prawdą jest, jeśli zawiera możliwe zakleszczenie. Na przykład:
true
false
1
0
wszystkie prawidłowe dane wyjściowe, ale wszystko, co jest jasno określone jako prawda / fałsz, zostanie zaakceptowane.
Przykłady
+a
-a
---
+a
-a
Wynik: false
+a
+b
-b
-a
---
+b
+a
-a
-b
Wynik true
Zakleszczenie przy próbie uzyskania b,a
odpowiednio dla wątków1,2
+a
+b
-a
-b
---
+a
+b
-b
-a
Wynik false
+a
+b
-b
-a
---
+b
+c
-c
-b
---
+c
+a
-a
-c
Wynik: true
Zakleszczenie w wątkach 1,2,3 podczas próby uzyskania b,c,a
odpowiednio.
Wynik false
Wynik true
Zakleszczenie w wątkach 1,2,3 podczas próby uzyskania b,d,a
odpowiednio.
Oczywiście może to stać się znacznie bardziej złożone, z większą liczbą wątków, większą ilością zasobów dla każdego z nich i tak dalej, ale uważam, że te testy obejmują podstawy.
Premia
Ponieważ jest to bardzo smutne, gdy znajdziesz sytuacje impasu pisząc program, istnieje -8 bajt bonus do odpowiedzi transmitują :(
i :)
jak truthy / falsy odpowiednio.
d
aż do później.:)
nie powinieneś być za fałszem i:(
prawdą?Odpowiedzi:
Python 2 - 227
Zasadniczo upewnia się, że nie ma pętli „pierwszeństwa”. Na przykład w drugim teście pierwszy wątek ma
a(b)
pierwszeństwo, a drugi wątek mab(a)
pierwszeństwo.Myślałem o przepisaniu tego w Pyth, ponieważ myślę, że dobrze by to działało ze wszystkimi operacjami itertools, ale konwersja wyrażenia regularnego zajmie trochę pracy, więc na razie opublikuję to i może spróbuję przekonwertować to i opublikować kolejną odpowiedź później.
źródło
Python -
586539524501485 bajtów - 8 = 477Poziomy wcięć:
-
źródło
;
do łączenia linii wciętych w celu zapisania znaków. Podobnie, uczyńcie swoje oświadczenia jednymi linijkami.for r in sys.stdin
zamiastfor r in sys.stdin.readlines()
sys.stdin
albosys.stdin.readlines()
, więc znowu zmienił go, dzięki.print
i':)'