2011-12-20 40 views
12

Tôi đang tìm một hàng đợi ưu tiên được triển khai trong Delphi sẽ hoạt động tốt trong môi trường nhiều luồng.Hàng đợi ưu tiên an toàn cho Delphi?

Lý tưởng không khóa hoặc được thiết kế để chèn/xóa nhiều luồng với thứ gì đó tốt hơn so với trình bao bọc bị khóa xung quanh việc triển khai một luồng (mà tôi đã có).

Tính đặc hiệu là trong hoạt động bình thường, sẽ chỉ có thêm, xóa và thông báo khi thay đổi trên cùng (mục có mức ưu tiên cao nhất) trong khi hoạt động "pop" của mục có mức độ ưu tiên cao nhất sẽ rất hiếm khi xảy ra.

Nó sẽ được sử dụng cho một nhiệm vụ giám sát chuỗi thời gian chờ/giám sát, được thực hiện trong các chủ đề khác, nhiệm vụ đó được dự kiến ​​sẽ chấm dứt bình thường hầu hết thời gian, vì vậy chúng sẽ được thêm/xóa khỏi hàng đợi. Chuỗi thời gian chờ về cơ bản sẽ chờ trong sự kiện thời gian chờ tiếp theo, do đó cần thông báo khi sự kiện ưu tiên hàng đầu thay đổi.

Các tác vụ được xử lý bởi tập lệnh, có thể được chấm dứt an toàn bất kỳ lúc nào.

Nếu có thuật toán tốt hơn cho hàng này so với hàng đợi ưu tiên, chúng cũng có thể là câu trả lời hay!

Chỉnh sửa: sau một nhận xét của Martin James, một đặc trưng khác là có tương đối ít giá trị thời gian chờ khác nhau và cho mỗi giá trị hết giờ, sự cố sẽ trở thành hàng đợi FIFO.

+0

Tại sao "trình bao bọc bị khóa xung quanh triển khai một luồng" không đủ tốt cho tác vụ này? – Pol

+0

Những hạn chế về hiệu năng làm cho giải pháp dựa trên khóa không phù hợp là gì? –

+0

@ Pol: Nó không đủ tốt vì tôi đã có một (như đã nói trong bài viết) –

Trả lời

0

Thay vì một hàng đơn, bạn có thể sử dụng một hàng đợi cho từng mức độ ưu tiên.

Các OmnithreadLibrary chứa chủ đề hàng đợi an toàn: http://code.google.com/p/omnithreadlibrary/

http://code.google.com/p/omnithreadlibrary/

+4

Nhiều hàng đợi đơn ưu tiên không thực sự là giải pháp. Tất cả các hoạt động 'popping' trở nên phức tạp vô cùng. (Đẩy mạnh, OTOH, rất đơn giản.) Trong kế hoạch trung hạn của tôi là một TODO nói "kiểm tra khả năng xếp hàng ưu tiên không có khóa" nhưng điều đó sẽ không xảy ra trong vài tháng tới. – gabr

1

Julian Bucknall (Tác giả của "Tomes của Delphi: Các thuật toán và cấu trúc dữ liệu") gần đây đã công bố việc phát hành một phiên bản Delphi XE của EZDSL (Thư viện cấu trúc Delphi) trong số Blog của mình.

Thật không may TThreadsafePriorityQueue (được triển khai trong EZDSLPQu.PAS) là khóa dựa.

Tôi không thể giúp chia sẻ tin vui và mục đích khác của tôi là lời kêu gọi đóng góp của anh ấy trong việc trả lời câu hỏi.

+0

Tôi đã sử dụng EZDSL cá nhân của riêng mình từ mãi mãi, và nếu tôi tin tưởng bất cứ điều gì để bắt đầu với tư cách là một cơ sở, đó là EZDSL. –

1

Kiến trúc khung của tôi được xây dựng hoàn toàn xung quanh hàng đợi có chuỗi ưu tiên - đó là mô hình luồng duy nhất tôi sử dụng (http://www.csinnovations.com/framework_overview.htm). Một đường cong học tập dốc, nhưng nó có thể cung cấp cho bạn một số ý tưởng.

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