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?
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
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? –