2009-01-02 35 views
7

Tôi nghĩ rằng tôi muốn sử dụng Boost.Interprocess's Message Queue thay cho ổ cắm để liên lạc trong một máy chủ. Nhưng sau khi đào sâu vào nó, có vẻ như thư viện này vì lý do nào đó sẽ tránh khỏi cơ sở hàng đợi thông điệp POSIX (hệ thống Linux của tôi hỗ trợ), và thay vào đó được thực hiện trên bộ nhớ chia sẻ POSIX. Giao diện tương tự đủ để bạn có thể không đoán ngay, nhưng có vẻ như vậy.Tăng Hàng đợi Tin nhắn không dựa trên hàng đợi tin nhắn POSIX? Không thể chọn (2)?

Nhược điểm của tôi là bộ nhớ chia sẻ thu được qua shm_open(3) dường như không thể sử dụng được với select(2), trái với hàng đợi thông báo POSIX thu được qua mq_open(3).

Dường như thư viện của Boost bị mất trong trường hợp này. Có ai hiểu tại sao điều này nên được? Ngay cả khi hàng đợi tin nhắn POSIX chỉ có sẵn trên một số hệ thống, tôi mong đợi Boost sẽ sử dụng cơ sở đó khi có sẵn và chỉ thực hiện lại khi cần thiết. Có một số lỗ hổng của hệ thống POSIX mà tôi chưa nhận ra?

Trả lời

4

Tôi đã gặp phải tình huống tương tự vào ngày khác khi sử dụng lớp đồng bộ hóa Boost.Interprocess: cụ thể là lớp điều kiện. Nó được thực hiện một cách "chung chung", nhưng cách nó đã được thực hiện là sử dụng một spinlock tùy chỉnh là cao không hiệu quả (trên OS X ít nhất). Đối với tất cả các ý định và mục đích nó làm cho các lớp đồng bộ vô dụng.

Theo kinh nghiệm của tôi, thư viện Interprocess khá chưa trưởng thành. Tôi sử dụng nó để chia sẻ bộ nhớ, và nó hoạt động khá tốt nhưng có một số cạnh thô và tôi đã phải hack xung quanh một số "thiếu tính năng" chẳng hạn như tự động thay đổi kích thước bộ nhớ chia sẻ, vv

Tóm lại, không mong đợi thư viện này là một viên đạn bạc. Nó tốt, nhưng không đặc biệt vào lúc này.

+0

Lưu ý rằng trên Linux, thay vì sử dụng một spinlock tùy chỉnh, nó sử dụng các mutexes chia sẻ và các biến điều kiện, sẽ gần như hiệu quả như các mutex trong cùng một quá trình. Tuy nhiên, để chọn các đối tượng 'boost :: interprocess', bạn sẽ cần phải có một thread theo dõi đối tượng đang được đề cập và bump một fifo hoặc eventfd khi có một số dữ liệu chờ đợi. – bdonlan

+0

Tuy nhiên, không có lời giải thích là tại sao tăng :: interprocess không sử dụng momenue posix khi có sẵn ... Tôi đã làm một mexue abstration bản thân mình rằng khi xây dựng trên win32, abstraction của tôi sử dụng tăng :: interprocess :: mqueue và khi xây dựng trên linux, trừu tượng của tôi sử dụng mixue posix. Điều đó thật dễ dàng, đây là lý do tại sao tôi không thể tìm thấy lý do tại sao tăng :: interprocess không làm như vậy. Chưa trưởng thành? Một cái gì đó tôi giám sát? –

1

Vâng, rất tiếc là không. Tôi cũng đã thất vọng khi nhận ra rằng sau khi đào bới nguồn.

Nhưng ở đây là khác (tốt) bên của thực tế này: nếu chương trình của bạn sử dụng boost::asio, bạn có thể quấn POSIX nhắn hàng đợi API như chỉ là một datagram nguồn dữ liệu và điều này (IMHO) sẽ là tốt hơn để sử dụng nếu nó là một phần của boost::interprocess ... nó sẽ là khá tầm thường, nhưng (IMHO) chắc chắn xứng đáng này, vì vậy bạn có thể làm việc w/MQ một cách thống nhất và sử dụng điện khác boost::asio công cụ ...

... trong dự án tiếp theo của tôi nếu tôi cần POSIX MQ lần nữa, tôi chắc chắn sẽ thực hiện theo cách này :)

+0

Tôi đã có cùng một ý tưởng về việc sử dụng boost :: asio cho hàng đợi tin nhắn, chính xác như bạn đề xuất, như một nguồn datagram khác. Bạn đã có bất kỳ kinh nghiệm thêm một nguồn datagram để tăng :: asio? Tôi đã chỉ trầy xước bề mặt của chủ đề bằng cách đọc một số mã nguồn từ tăng, nhưng tôi vẫn chưa tìm thấy docu/hướng dẫn tốt về chủ đề này ... –

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