2011-06-28 35 views
9

Tôi đã xem các bộ sưu tập đồng thời nhưng chúng dường như sử dụng khóa bình thường bên dưới mui xe. Có bất kỳ ví dụ hay trong khung .Net sử dụng cấu trúc khóa này không?Có bất kỳ ví dụ nào trong khung .Net sử dụng spinlock hoặc spinwait không?


Ban đầu tôi xem ConcurrentDictionary. Tôi thấy nó đã được sử dụng khóa bình thường nhưng lớp BlockingCollection sử dụng SpinWait trong phương pháp nội bộ của nó.

+0

Tại sao bạn làm điều đó? khóa xoay là cơ chế chờ đợi bận rộn, tức là sử dụng tài nguyên mà không làm bất kỳ điều gì hữu ích –

+0

Hoàn toàn là giáo dục. Tôi không nghĩ rằng tôi sẽ cần phải làm điều này. Nhưng tôi chỉ muốn tìm hiểu thêm về nó và xem xét một ví dụ tốt. Hầu hết các ví dụ là khá contrived lúc tốt nhất. – uriDium

+0

Rằng bạn dường như không thể tìm thấy các ví dụ thực tế về cuộc sống đã nói rất nhiều trong quan điểm của tôi. –

Trả lời

4

Ý bạn là gì bằng cách khóa thông thường? Một số loại cấu trúc lock(object) { ... }?

Nếu có, bạn nên xem ConcurrentStack ví dụ: sử dụng SpinWait cho công việc của mình.

4

Khá nhiều lớp thu thập đồng thời khóa thấp sẽ có khả năng sử dụng một số kết hợp của SpinWaitYield. Mặc dù ConcurrentDictionary là một ngoại lệ đáng chú ý. Danh sách các lớp tôi tìm thấy bao gồm những điều sau đây.

  • ManualResetEventSlim
  • SemaphoreSlim
  • spinlock
  • Barrier
  • ReaderWriterLockSlim
  • ConcurrentQueue
  • ConcurrentStack
  • BlockingCollection
2

ConcurrentStack và ConcurrentQueue là các bộ sưu tập không có khóa, tuy nhiên ConcurrentDictionary, ConcurrentBag đang sử dụng khóa. BlockingCollections chỉ là một vùng chứa vì vậy nó không phải là một bộ sưu tập của chính nó, nó phải bọc các bộ sưu tập chủ đề khác, ví dụ var bc = new BlockingCollection (new ConcurrentStack());

đây là một bài viết giới thiệu về cách sử dụng SpinWait trong mã lock-free http://www.emadomara.com/2011/08/spinwait-and-lock-free-code.html

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