Kilitlenmeyi Bulma
Çok iş parçacıklı bir uygulamayı programlarken, paylaşılan kaynaklara erişirken çeşitli iş parçacıklarının kilitlenmesini önlemek için çok dikkatli olunmalıdır. Bir iş parçacığı, diğer iş parçacığının birincisi tarafından kilitlenen bir kaynağa erişmeye çalıştığı sırada başka bir iş parçacığında kilitlenen bir kaynağa erişmeye çalıştığında bir kilitlenme oluşur. Bu basit bir durumdur, ancak daha uzun kaynak zincirleriyle daha karmaşık hale gelebilir.
Meydan okuma
Her iş parçacığının eriştiği kaynaklar listesine olası bir kilitlenme durumunu algılayabilen bir program veya işlev yazmalısınız. Bu kod golf, bayt en kısa cevap kazanır.
Her iş parçacığı aynı anda başlatılır, ancak bundan sonra herhangi bir serpiştirme kombinasyonunda çalışabilirler. 4 işlemlerden her biri 2 parçacığı vardır, (her numara, bu numara ile parçacığı tarafından yapılan bir işlem olduğu) olarak çalıştırılabilir 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
, ya da herhangi bir başka olası kombinasyon.
Giriş
STDIN, function parametresi veya en yakın alternatif olarak bir dize listesi alırsınız. Her dize formatta olacaktır +a
-b
. Bu dizelerin her biri, bir kaynağın iş parçacığı tarafından kilitlenmesini ( +
) / kilidini açmayı ( -
) temsil eder . Her iş parçacığı arasında bir ---
ayırıcı olacaktır . Bir iş parçacığının zaten kilitli olduğu bir kaynağı kilitlemeye çalışmadığı ve tüm iş parçacıklarının çıkmadan önce kilitledikleri tüm kaynakların kilidini açıkça açacağı garanti edilir. Aşağıda gösterilebilecek bir örnek verilmiştir:
+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
Çıktı
Girdi herhangi bir kilitlenme olasılığı içermiyorsa çıktı hatalı ve olası bir kilitlenme durumu içeriyorsa doğrudur. Örneğin:
true
false
1
0
hepsi geçerli çıktılardır, ancak açık / doğru olarak tanımlanan herhangi bir şey kabul edilecektir.
Örnekler
+a
-a
---
+a
-a
Çıktı: false
+a
+b
-b
-a
---
+b
+a
-a
-b
Çıktı true
İş b,a
parçacıkları için sırasıyla edinmeye çalışırken kilitlenme1,2
+a
+b
-a
-b
---
+a
+b
-b
-a
Çıktı false
+a
+b
-b
-a
---
+b
+c
-c
-b
---
+c
+a
-a
-c
Çıktı: true
b,c,a
Sırasıyla elde etmeye çalışırken dişlilerin 1,2,3 kilitlenmesi .
Çıktı false
Çıktı true
Akarsu olmaya çalışırken b,d,a
sırasıyla 1,2,3 ipliklerinde kilitlenme .
Tabii ki bu çok daha karmaşık hale gelebilir, daha fazla iplik, her biri için daha fazla kaynak ve benzeri, ancak bu testlerin temelleri kapsadığına inanıyorum.
Bonus
Bir program yazarken kilitlenme durumları bulduğunuzda çok üzücü olduğu için , çıktıları yanıtlamak için sırasıyla -8 bayt bonusu vardır :(
ve :)
sırasıyla doğru / falsy olarak bulunur.
d
daha sonraya kadar kaynak kullanmaya çalışmadığı için bu gösterilmiştir .
:)
yanlış ve :(
doğru olmadığından emin misin ?