Kịch bản của tôi: một máy chủ và một số máy khách (mặc dù không nhiều). Máy chủ chỉ có thể phản hồi một khách hàng tại một thời điểm, vì vậy chúng phải được xếp hàng đợi. Tôi đang sử dụng một mutex (boost::interprocess::interprocess_mutex
) để làm điều này, được bọc trong một boost::interprocess::scoped_lock
. Điều này là, nếu một khách hàng chết bất ngờ (tức là không có destructor nào chạy) trong khi đang nắm giữ mutex, các khách hàng khác đang gặp rắc rối, bởi vì họ đang chờ đợi trên mutex đó. Tôi đã xem xét sử dụng thời gian chờ đợi, vì vậy nếu tôi khách hàng chờ đợi, nói rằng, 20 giây và không nhận được mutex, nó đi trước và nói chuyện với máy chủ anyway.Làm cách nào để có quyền sở hữu một quảng cáo bị bỏ qua :: interprocess :: interprocess_mutex?
Các vấn đề với cách tiếp cận này: 1) nó thực hiện việc này mọi lúc. Nếu nó trong một vòng lặp, nói chuyện liên tục với máy chủ, nó cần phải chờ thời gian chờ mỗi lần duy nhất. 2) Nếu có ba khách hàng, và một trong số họ chết trong khi giữ mutex, hai người kia sẽ chỉ chờ 20 giây và nói chuyện với máy chủ cùng một lúc - chính xác những gì tôi đang cố gắng tránh.
Vì vậy, làm cách nào tôi có thể nói với khách hàng ", ở đó, có vẻ như đột biến này đã bị hủy, hãy sở hữu nó"?
Nếu bạn đang dựa vào khách hàng để thực hiện đồng bộ hóa, bạn đang làm việc đó ngược. Bạn thực sự nên sửa chữa máy chủ của bạn để nó có thể chấp nhận nhiều kết nối, ngay cả khi nó chỉ làm cho các kết nối khác chờ đợi trong khi nó phục vụ một tại một thời điểm. Điều đó cho phép bạn lấy phần * interprocess * ra khỏi phương trình. –
Điểm công bằng. Tuy nhiên, ứng dụng của tôi ban đầu được chỉ định là chỉ có một khách hàng tại một thời điểm - tôi chỉ mới gần đây (như trong ngày hôm nay) phát hiện ra rằng có thể có nhiều khách hàng. Tôi đã cố gắng giải quyết nó một cách dễ dàng, nhưng tôi cho rằng tôi sẽ phải nghĩ ra điều gì đó tinh vi hơn. –
Dường như toàn bộ cơ chế của mutex là thiếu sót mà không có cơ chế phục hồi. Ước muốn tăng cường sửa lỗi này. – balki