Нахождение тупика
При программировании многопоточного приложения необходимо соблюдать осторожность, чтобы избежать блокировки различных потоков при доступе к общим ресурсам. Тупиковый происходит , когда поток пытается получить доступ к ресурсу , который заперт в другом потоке , в то же время, другой поток пытается получить доступ к ресурсу блокируется первым. Это простой случай, но он может стать более сложным с более длинными цепочками ресурсов.
Соревнование
Вы должны написать программу или функцию, которая может обнаружить возможную ситуацию взаимоблокировки в списке ресурсов, к которым обращается каждый поток. Это код-гольф, поэтому выигрывает самый короткий ответ в байтах.
Все потоки запускаются одновременно, но после этого они могут работать при любом сочетании чередования. Если есть 2 нити с 4 -х действиях каждого, она может быть запущена как (где каждое число представляет собой действие , предпринимаемое нити с этим идентификатором) 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
Тупик в темах 1,2,3 при попытке приобрести b,c,a
соответственно.
Выход false
Выход true
Тупик в темах 1,2,3 при попытке добыть b,d,a
соответственно.
Конечно, это может быть намного сложнее, с большим количеством потоков, большим количеством ресурсов для каждого и так далее, но я считаю, что эти тесты охватывают основы.
бонус
Так как это очень и очень печально, когда вы находите тупиковые ситуации при написании программы, есть бонус -8 байт к выводу ответов :(
и :)
как к правде / ложности соответственно.
d
до позднего времени.:)
не должно быть ложным и:(
истинным?Ответы:
Python 2 - 227
По сути, убедитесь, что нет никаких циклов «приоритета». Например, во втором тесте первый поток имеет
a(b)
приоритет, а второй поток имеетb(a)
приоритет.Я думал о переписывании этого в Pyth, так как думаю, что это будет хорошо работать со всеми операциями itertools, но преобразование регулярного выражения потребует некоторой работы, поэтому сейчас я опубликую это и, возможно, постараюсь преобразовать его и опубликовать другой ответ позже.
источник
Python -
586539524501485 байт - 8 = 477Уровни отступов:
-
источник
;
для объединения строк с отступом для сохранения символов. Аналогично, делайте ваши заявления одним лайнером.for r in sys.stdin
вместоfor r in sys.stdin.readlines()
sys.stdin
илиsys.stdin.readlines()
, поэтому я изменил его, еще раз спасибо.print
и':)'