Tôi có nhu cầu đồng bộ hóa interprocess xung quanh một phần cứng. Bởi vì mã này sẽ cần phải làm việc trên Windows và Linux, tôi đang gói với mutexes Boost Interprocess. Mọi thứ đều hoạt động tốt chấp nhận phương pháp của tôi để kiểm tra việc bỏ qua mutex. Có khả năng điều này có thể xảy ra và vì vậy tôi phải chuẩn bị cho nó.Tăng đột biến interprocess và kiểm tra từ bỏ
Tôi đã bỏ qua mutex trong thử nghiệm của mình và, đủ chắc chắn, khi tôi sử dụng scoped_lock để khóa mutex, quá trình chặn vô thời hạn. Tôi đã tìm ra cách xung quanh vấn đề này bằng cách sử dụng cơ chế timeout trên scoped_lock (vì đã dành nhiều thời gian cho Googling cho các phương thức để tính toán điều này không thực sự hiển thị nhiều, việc tăng cường không làm nhiều việc này vì các lý do về tính di động).
Nếu không có thêm ado, đây là những gì tôi có:
#include <boost/interprocess/sync/named_recursive_mutex.hpp>
#include <boost/interprocess/sync/scoped_lock.hpp>
typedef boost::interprocess::named_recursive_mutex MyMutex;
typedef boost::interprocess::scoped_lock<MyMutex> ScopedLock;
MyMutex* pGate = reinterpret_cast<MyMutex*>(new MyMutex(boost::interprocess::open_or_create, "MutexName");
{
// ScopedLock lock(*pGate); // this blocks indefinitely
boost::posix_time::ptime timeout(boost::posix_time::microsec_clock::local_time() + boost::posix_time::seconds(10));
ScopedLock lock(*pGate, timeout); // a 10 second timeout that returns immediately if the mutex is abandoned ?????
if(!lock.owns()) {
delete pGate;
boost::interprocess::named_recursive_mutex::remove("MutexName");
pGate = reinterpret_cast<MyMutex*>(new MyMutex(boost::interprocess::open_or_create, "MutexName");
}
}
đó, ít nhất, là ý tưởng. Ba điểm thú vị:
- Khi tôi không sử dụng đối tượng thời gian chờ, và mutex bị hủy, các khối ScopedLock ctor vô thời hạn. Đó là dự kiến.
- Khi tôi sử dụng thời gian chờ và mutex bị hủy, hàm scopedLock sẽ trả về ngay lập tức và cho tôi biết rằng nó không sở hữu mutex. Ok, có lẽ đó là bình thường, nhưng tại sao không phải là nó chờ đợi trong 10 giây tôi nói với nó quá?
- Khi mutex không bị bỏ rơi và tôi sử dụng hết thời gian chờ, lò vi sóng ScopedLock vẫn trả về ngay lập tức, nói với tôi rằng nó không thể khóa hoặc chiếm quyền sở hữu của mutex và tôi đi qua chuyển động mutex và làm lại nó. Đây không phải là tất cả những gì tôi muốn.
Vì vậy, tôi thiếu gì khi sử dụng các đối tượng này? Có lẽ nó đang nhìn chằm chằm vào mặt tôi, nhưng tôi không thể nhìn thấy nó và vì vậy tôi yêu cầu giúp đỡ.
Tôi cũng nên đề cập rằng, vì phần cứng này hoạt động như thế nào, nếu quá trình không thể giành quyền sở hữu của mutex trong vòng 10 giây, thì mutex bị bỏ qua. Trong thực tế, tôi có thể chờ đợi ít nhất là 50 hoặc 60 mili giây, nhưng 10 giây là một số lượng "tròn" hào phóng.
Tôi đang biên soạn trên Windows 7 sử dụng Visual Studio 2010.
Cảm ơn, Andy
Không liên quan đến câu hỏi của bạn, nhưng 'reinterpret_cast' s trong ví dụ của bạn là không cần thiết (không chắc chắn lý do tại sao chúng ở đó). –
@GaborMarton Tôi nghĩ rằng tôi đang sử dụng đúng chức năng remove(). Kiểm tra lại mã. Tôi đang xóa con trỏ, mà tôi đồng ý không loại bỏ mutex, nhưng sau đó tôi gọi boost :: interprocess :: named_recursive_mutex :: remove ("MyMutex"). Nếu tôi đã sử dụng không đúng cách, hãy sửa tôi. Cảm ơn –
Có, bạn đã đúng, vừa xóa nhận xét của tôi và cập nhật câu trả lời của tôi. Hy vọng rằng sẽ giúp. –