2009-03-23 43 views
24

Monitor.PulseAll thông báo tất cả các chuỗi đang chờ trong hàng đợi.Sự khác biệt giữa Monitor.Pulse và Monitor.PulseAll

Monitor.Pulse thông báo một chủ đề trong hàng chờ. (Chuỗi chờ tiếp theo)

Chỉ chuỗi tiếp theo (một chuỗi) mới có thể lấy khóa. Vì vậy, sự khác biệt là gì?

Khi nào tôi nên sử dụng Pulse so với PulseAll?

+0

Nhận xét thông minh: 'Pulse' gây ra một vấn đề,' PulseAll' gây ra mọi vấn đề. Bạn thực sự nên sử dụng 'ManualResetEvent' hoặc' AutoResetEvent'. –

Trả lời

41

Sử dụng PulseAll khi bạn muốn đánh thức nhiều chủ đề, bởi vì điều kiện mà chúng đang đợi hiện có thể được thực hiện cho nhiều hơn một chuỗi. (Việc chờ gần như luôn luôn được liên kết với một điều kiện - bạn nên thường xuyên kiểm tra điều kiện đó trong một vòng lặp while.)

Sử dụng Pulse khi bạn chỉ muốn đánh thức một chủ đề, bởi vì chỉ có một luồng sẽ thực sự hữu ích công việc.

Để cung cấp hai điểm tương tự:

Hãy tưởng tượng bạn đã có một máy in duy nhất. Chỉ có một người có thể sử dụng nó tại một thời điểm, vì vậy nếu bạn có rất nhiều người chờ đợi, bạn gửi cho họ tất cả để ngủ - nhưng bạn chỉ đánh thức một người lên khi máy in trở nên miễn phí. Điều này phản ánh việc sử dụng Pulse.

Bây giờ hãy tưởng tượng bạn điều hành một cửa hàng. Trong khi bạn đóng cửa, khách hàng chờ đợi bên ngoài cửa hàng. Khi bạn mở cửa hàng, bạn không chỉ muốn thức dậy một khách hàng - tất cả họ có thể đến ngay bây giờ. Điều này phản ánh việc sử dụng PulseAll.

+3

"Khi luồng được gọi ra PulseAll giải phóng khóa, chuỗi tiếp theo trong hàng đợi sẵn sàng mua lại khóa." - nếu tôi chỉ có thể xử lý một khách hàng một lần - tại sao tôi phải thức dậy mọi người? –

+0

* Nếu * bạn chỉ có thể xử lý một khách hàng tại một thời điểm, bạn sẽ không. Trừ khi bạn muốn để cho họ tất cả các trình duyệt, và sau đó xếp hàng tại thanh toán để trả tiền ... –

+0

(Rất ít cửa hàng chỉ cho phép một khách hàng tại một thời điểm :) –

30

A Monitor có hai hàng đợi: hàng chờ và hàng sẵn sàng. Trong trường hợp không có WaitPulse, tất cả các chuỗi cố gắng lấy khóa sẽ đi vào hàng đợi sẵn sàng. Khi khóa khả dụng, một chuỗi từ hàng đợi sẵn sàng sẽ có được nó.

Khi một chủ đề mua khóa và sau đó thực hiện Wait, chuỗi đó sẽ đi vào hàng chờ. Nó đang đợi Pulse hoặc PulseAll và sẽ vẫn nằm trong hàng chờ đợi cho đến khi nó nhận được Pulse, ngay cả khi các luồng khác từ hàng đợi sẵn sàng có được và giải phóng khóa.

Pulse di chuyển một chuỗi từ hàng chờ đến hàng đợi sẵn sàng. PulseAll di chuyển TẤT CẢ các chủ đề từ hàng chờ đến hàng đợi sẵn sàng.

Chìa khóa ở đây là các chuỗi trong hàng chờ đợi không bao giờ có thể lấy khóa. Họ đang chờ đợi một xung để di chuyển chúng trở lại hàng đợi sẵn sàng để họ có thể có được khóa khi nó trở nên có sẵn.

Có một cuộc thảo luận hợp lý về Wait và Pulse - ít nhất một chút để bạn bắt đầu-- here.

+1

Mô tả rất rõ ràng. –

+1

Cảm ơn bạn đã giải thích rất rõ! Bạn có thể làm rõ điều gì sẽ xảy ra với chủ đề xung không? Có di chuyển đến hàng đợi đã sẵn sàng và có thể lập lịch lại ngay lập tức thay vì chỉ chuyển từ hàng chờ đến rea dy hàng đợi (vì Pulse)? –

+3

@RamiYampolsky: Chủ đề mà 'Pulse' giữ lại khóa. Nó phải gọi 'Wait' hoặc' Exit' để giải phóng khóa trước khi chuỗi tiếp theo trong hàng đợi sẵn sàng có thể lấy khóa. –

Các vấn đề liên quan