Den Deadlock finden
Beim Programmieren einer Multithreading-Anwendung muss sorgfältig darauf geachtet werden, dass die verschiedenen Threads beim Zugriff auf gemeinsam genutzte Ressourcen nicht blockieren. Ein Deadlock tritt auf, wenn ein Thread versucht, auf eine Ressource zuzugreifen, die in einem anderen Thread gesperrt ist, während der andere Thread versucht, auf eine von der ersten gesperrte Ressource zuzugreifen. Dies ist der einfache Fall, kann jedoch mit längeren Ressourcenketten komplexer werden.
Die Herausforderung
Sie sollten ein Programm oder eine Funktion schreiben, die eine mögliche Deadlock-Situation in einer Liste der Ressourcen erkennt, auf die von jedem Thread zugegriffen wird. Das ist Code-Golf, also gewinnt die kürzeste Antwort in Bytes.
Jeder Thread wird zur gleichen Zeit gestartet, kann danach jedoch mit jeder Kombination von Interleaving ausgeführt werden. Bei 2 Fäden mit 4 Aktionen je könnte es als ausgeführt werden (wobei jede Zahl eine Aktion durch das Gewinde mit dieser ID genommen ist) 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
oder irgendeine andere mögliche Kombination.
Eingang
Sie erhalten über STDIN, Funktionsparameter oder die nächstgelegene Alternative eine Liste von Zeichenfolgen. Jede Zeichenfolge hat das Format +a
-b
. Jede dieser Zeichenfolgen repräsentiert das Sperren ( +
) / Entsperren ( -
) einer Ressource durch den Thread. Zwischen jedem Thread befindet sich ein ---
Trennzeichen. Es wird garantiert, dass ein Thread nicht versucht, eine bereits gesperrte Ressource zu sperren, und dass alle Threads alle gesperrten Ressourcen explizit entsperren, bevor sie beendet werden. Das Folgende ist ein Beispiel, um zu demonstrieren:
+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
Ausgabe
Die Ausgabe ist falsch, wenn die Eingabe keine Deadlock-Möglichkeit enthält, und wahr, wenn sie eine mögliche Deadlock-Situation enthält. Beispielsweise:
true
false
1
0
sind alle gültigen Ausgaben, aber alles, was klar als wahr / falsch definiert ist, wird akzeptiert.
Beispiele
+a
-a
---
+a
-a
Ausgabe: false
+a
+b
-b
-a
---
+b
+a
-a
-b
Ausgabe true
Deadlock beim Versuch, b,a
jeweils für Threads zu erfassen1,2
+a
+b
-a
-b
---
+a
+b
-b
-a
Ausgabe false
+a
+b
-b
-a
---
+b
+c
-c
-b
---
+c
+a
-a
-c
Ausgabe: true
Deadlock in den Threads 1, 2, 3 beim Versuch, b,c,a
jeweils zu erfassen .
Ausgabe false
Ausgabe true
Deadlock in den Threads 1, 2, 3 beim Versuch, b,d,a
jeweils zu erwerben .
Natürlich könnte dies viel komplexer werden, mit mehr Threads, mehr Ressourcen für jeden einzelnen und so weiter, aber ich glaube, diese Tests decken die Grundlagen ab.
Bonus
Da es sehr sehr traurig ist , wenn man Deadlocksituationen finden , wenn ein Programm zu schreiben, gibt es einen -8 Byte Bonus Antworten ausgibt :(
und :)
als truthy / falsy sind.
d
erst später versucht, die Ressource zu verwenden .
:)
dass Sie nicht für falsch und :(
für wahr sein sollten?