Пошук тупика
Програмуючи багатопотокове додаток, слід уважно ставитися до того, щоб уникнути тупикового забруднення різних потоків під час доступу до спільних ресурсів. Тупиковий відбувається , коли потік намагається отримати доступ до ресурсу , який замкнений в іншому потоці , в той же час, інший потік намагається отримати доступ до ресурсу блокується першим. Це простий випадок, але він може бути складнішим з довшими ланцюжками ресурсів.
Змагання
Вам слід написати програму або функцію, яка може виявити можливу ситуацію з тупиком у списку ресурсів, до яких звертається кожен потік. Це код-гольф, тому найкоротша відповідь у байтах виграє.
Кожна нитка запускається одночасно, але після цього вони можуть працювати в будь-якій комбінації переплетення. Якщо є 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
всі дійсні результати, але все чітко визначене як truthy / falesy буде прийнято.
Приклади
+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 байт для виводу відповідей :(
і відповідно :)
як truthy / falesy.
d
пізніше.
:)
не повинно бути неправдивим і :(
правдивим?