2012-08-23 40 views
11

Có hàng đợi ưu tiên có thể thay đổi đồng thời không? Lý tưởng nhất, tôi đang tìm kiếm một thực hiện C++, nhưng, để bắt đầu, một con trỏ đến một thuật toán sẽ rất hữu ích.Hàng đợi ưu tiên có thể thay đổi đồng thời

Để rõ ràng, tôi đang tìm hàng đợi ưu tiên, nơi tôi có thể điều chỉnh mức độ ưu tiên của các phần tử. Đặc biệt, concurrent_priority_queue của TBB không cung cấp chức năng cần thiết. (Đối với vấn đề đó, không phải của STL là priority_queue, ngay cả khi chúng tôi bỏ qua đồng thời.) Thư viện Boost.Heap cung cấp chức năng nối tiếp mà tôi muốn, nhưng không có đồng thời. Đương nhiên, tôi đang tìm kiếm thứ gì đó tốt hơn là chỉ khóa toàn bộ hàng đợi trên mọi hoạt động.

+0

Tôi nghi ngờ rằng bất kỳ hàng đợi nào như vậy sẽ cần một khóa thô hoặc thực sự có nhiều khóa hạt mịn và không được quá hiệu quả. Nhưng có thể có một cách tiếp cận khác cho vấn đề của bạn. Trường hợp sử dụng của bạn là gì? –

+0

Vâng .. Tôi không thể nhìn thấy một cách nhanh chóng để làm điều đó một cách đáng tin cậy. Khóa futex/criticalSection có phải là một vấn đề lớn không? Nó không thể mất nhiều thời gian để loại bỏ một con trỏ từ một nơi trong cây và chèn nó vào một nơi khác, (hoặc di chuyển con trỏ từ bộ sưu tập này sang bộ sưu tập khác, hoặc bất kỳ thứ gì cần thực hiện trong danh sách ưu tiên của bạn)? –

+0

Vâng, tôi đã thực sự hy vọng cho một cấu trúc dữ liệu không khóa. Đối với các bản cập nhật, với các cấu trúc dữ liệu thông thường mà chúng có liên quan: bạn không chỉ di chuyển con trỏ từ nơi này sang nơi khác, mà còn phải cân bằng lại cây hoặc thực hiện một thao tác tương tự. – foxcub

Trả lời

9

Hàng đợi ưu tiên đồng thời thường được triển khai bằng cách sử dụng máy ghi âm, vì vậy, ConcurrentSkipList của Facebook có thể phù hợp với yêu cầu của bạn.

+0

Đề xuất tuyệt vời. Cảm ơn bạn rất nhiều vì con trỏ. Tôi chỉ muốn họ có một trang tài liệu cho lớp này. – foxcub

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