2009-02-18 49 views
6

Giả sử tôi có ba chuỗi cần truy cập vào bộ sưu tập và tôi sử dụng khối khóa xung quanh quyền truy cập trong mỗi chuỗi. Sau đây sẽ xảy ra ...Tuyên bố Khóa C#

(1) Chủ đề 1 được khóa vào bộ sưu tập
(2) Chủ đề 2 bị chặn
(3) Chủ đề 3 bị chặn

Khi Chủ đề 1 phiên bản khóa, ai sẽ lấy khóa tiếp theo? Có truy cập FIFO không?

Cảm ơn

Trả lời

17

Bạn không nên quan tâm ai sẽ nhận khóa tiếp theo.

+2

Bạn có thể mở rộng để nói rằng bạn * không thể * quan tâm. Có lẽ. – JMD

+0

Tôi nhận ra rằng tôi nên lập trình các chủ đề để tôi không quan tâm, tôi chỉ tự hỏi cơ chế là gì. –

+2

http://msdn.microsoft.com/en-us/library/aa645740(VS.71).aspx#vcwlkthreadingtutorialexample4mutex "Tốc độ và hệ điều hành của máy chạy mẫu có thể ảnh hưởng đến thứ tự đầu ra". –

4

Giả sử nó giống như Win32 thì câu trả lời là nó có thể là FIFO nhưng nó có thể không (nó là cái gì khác). Ví dụ: chuỗi ưu tiên cao hơn phải là đầu tiên; nhưng chủ đề có thể tăng hoặc giảm tạm thời mức độ ưu tiên của họ tùy thuộc vào những gì họ đã làm gần đây.

+0

Từ những gì tôi đã đọc, điều này là chính xác. Khóa có thể được nghĩ về FIFO, nhưng nó không được đảm bảo. –

5

Câu hỏi của bạn ngụ ý rằng bạn đang tìm kiếm hành vi FIFO? Sau đó, bạn có thể muốn thử mã này bằng cách Jakub Sloup:

Monitor/lock which remember order in C# to simulate FIFO

Như đã đề cập trong câu trả lời khác không có trật tự đảm bảo chờ đợi đề sẽ nhận được một khóa.

+0

Liên kết bị hỏng, thật không may. –

4

Như một câu trả lời cho câu hỏi của bạn, tất cả các chủ đề sẽ nhận được monitor.pulse sau đó sẽ chiến đấu với ai sẽ nhận khóa bên cạnh.

Tôi tin rằng những người ở wintellect đã viết một blog về cách hành vi này có thể dẫn đến một tình huống không công bằng, nhưng không có sự công bằng ở tất cả trong màn hình.

3

Câu trả lời là theo định nghĩa, không xác định.