Tìm kiếm bế tắc
Khi lập trình một ứng dụng đa luồng, người ta phải cẩn thận để tránh bế tắc các luồng khác nhau khi truy cập các tài nguyên được chia sẻ. Sự bế tắc xảy ra khi một luồng cố gắng truy cập vào một tài nguyên bị khóa trong một luồng khác cùng lúc với luồng khác đang cố gắng truy cập vào một tài nguyên bị khóa bởi lần đầu tiên. Đây là trường hợp đơn giản, nhưng nó có thể phức tạp hơn với chuỗi tài nguyên dài hơn.
Các thách thức
Bạn nên viết một chương trình hoặc hàm có thể phát hiện tình huống bế tắc có thể xảy ra trong danh sách các tài nguyên được truy cập bởi mỗi luồng. Đây là môn đánh gôn, vì vậy câu trả lời ngắn nhất bằng byte thắng.
Mọi luồng được bắt đầu cùng một lúc, nhưng sau đó chúng có thể chạy ở bất kỳ kết hợp xen kẽ nào. Nếu có 2 bài với 4 hành động mỗi, nó có thể được chạy như (trong đó mỗi số là một hành động thực hiện bởi các chủ đề với 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
, hoặc bất kỳ sự kết hợp có thể khác.
Đầu vào
Bạn sẽ nhận được, thông qua STDIN, tham số hàm hoặc thay thế gần nhất, một danh sách các chuỗi. Mỗi chuỗi sẽ ở định dạng +a
-b
. Mỗi một chuỗi này đại diện cho khóa ( +
) / mở khóa ( -
) của tài nguyên theo luồng. Giữa mỗi luồng sẽ là một ---
dải phân cách. Đảm bảo rằng một luồng sẽ không cố khóa tài nguyên mà nó đã bị khóa và tất cả các luồng sẽ mở khóa rõ ràng tất cả các tài nguyên mà chúng đã khóa trước khi thoát. Sau đây là một ví dụ để chứng minh:
+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
Đầu ra
Đầu ra sẽ bị sai lệch nếu đầu vào không chứa bất kỳ khả năng bế tắc nào và sự thật nếu nó có thể xảy ra tình huống bế tắc. Ví dụ:
true
false
1
0
là tất cả các kết quả đầu ra hợp lệ, nhưng bất cứ điều gì được xác định rõ ràng là trung thực / giả mạo sẽ được chấp nhận.
Ví dụ
+a
-a
---
+a
-a
Đầu ra: false
+a
+b
-b
-a
---
+b
+a
-a
-b
Đầu ra true
Bế tắc khi cố gắng để có được b,a
tương ứng cho chủ đề1,2
+a
+b
-a
-b
---
+a
+b
-b
-a
Đầu ra false
+a
+b
-b
-a
---
+b
+c
-c
-b
---
+c
+a
-a
-c
Đầu ra: true
Bế tắc trong chủ đề 1,2,3 khi cố gắng để có được b,c,a
tương ứng.
Đầu ra false
Đầu ra true
Bế tắc trong luồng 1,2,3 khi cố gắng để b,d,a
tương ứng.
Tất nhiên điều này có thể phức tạp hơn nhiều, với nhiều luồng hơn, nhiều tài nguyên hơn cho mỗi thứ, v.v., nhưng tôi tin rằng các thử nghiệm này bao gồm những điều cơ bản.
Tặng kem
Vì rất buồn khi bạn tìm thấy các tình huống bế tắc khi viết chương trình, có phần thưởng -8 byte cho các câu trả lời xuất ra :(
và :)
tương ứng là sự thật / giả.
d
cho đến sau này.
:)
không nên sai và :(
đúng không?