Alla ricerca dello stallo
Quando si programma un'applicazione multithreading, è necessario prestare molta attenzione per evitare il deadlock dei vari thread quando si accede alle risorse condivise. Un deadlock si verifica quando un thread tenta di accedere a una risorsa bloccata in un altro thread nello stesso momento in cui l'altro thread sta tentando di accedere a una risorsa bloccata dal primo. Questo è il caso semplice, ma può diventare più complesso con catene di risorse più lunghe.
La sfida
È necessario scrivere un programma o una funzione in grado di rilevare una possibile situazione di deadlock in un elenco delle risorse a cui accede ogni thread. Questo è code-golf, quindi vince la risposta più breve in byte.
Ogni thread viene avviato contemporaneamente, ma successivamente può essere eseguito in qualsiasi combinazione di interfogliatura. Se ci sono 2 fili con 4 azioni ciascuno, potrebbe essere eseguito come (dove ogni numero è un'azione intrapresa dal filo con quella 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
, o qualsiasi altra combinazione possibile.
Ingresso
Riceverai, tramite STDIN, il parametro della funzione o l'alternativa più vicina, un elenco di stringhe. Ogni stringa sarà nel formato +a
-b
. Ognuna di queste stringhe rappresenta il blocco ( +
) / unlocking ( -
) di una risorsa da parte del thread. Tra ogni thread sarà un ---
separatore. È garantito che un thread non tenterà di bloccare una risorsa che ha già bloccato e che tutti i thread sbloccheranno esplicitamente tutte le risorse che hanno bloccato prima di uscire. Di seguito è riportato un esempio per dimostrare:
+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
Produzione
L'output deve essere falso se l'input non contiene alcuna possibilità di deadlock e in verità se contiene una possibile situazione di deadlock. Per esempio:
true
false
1
0
sono tutti output validi, ma qualsiasi cosa chiaramente definita come verità / falsità sarà accettata.
Esempi
+a
-a
---
+a
-a
Produzione: false
+a
+b
-b
-a
---
+b
+a
-a
-b
Produzione true
Deadlock quando si tenta di acquisire b,a
rispettivamente per i thread1,2
+a
+b
-a
-b
---
+a
+b
-b
-a
Produzione false
+a
+b
-b
-a
---
+b
+c
-c
-b
---
+c
+a
-a
-c
Produzione: true
Deadlock nei thread 1,2,3 quando si tenta di acquisire b,c,a
rispettivamente.
Produzione false
Produzione true
Deadlock nei thread 1,2,3 quando si tenta di acquisire b,d,a
rispettivamente.
Naturalmente questo potrebbe diventare molto più complesso, con più thread, più risorse per ognuno e così via, ma credo che questi test coprano le basi.
indennità
Dato che è molto triste quando trovi situazioni di deadlock durante la scrittura di un programma, c'è un bonus di -8 byte per le risposte in uscita :(
e rispettivamente :)
come verità / falsa.
d
fino a dopo.
:)
che non dovrebbe essere :(
vero o falso ?