2011-10-18 23 views
5

Tôi đang sử dụng boost::interpocess::scoped_lock bằng cách sử dụng named_mutextimeout; Tôi đang chạy trong hệ điều hành Linux.thúc đẩy quá trình liên kết có tên mutex vẫn được mua sau khi xảy ra sự cố

Trong một trong các thử nghiệm của tôi, tôi đã gặp sự cố: từ đó, mỗi lần tôi thử chạy lại ứng dụng, nó bị kẹt ở điểm tôi tạo khóa; có vẻ như mutex vẫn có được một số cách (không có quá trình nào có thể sử dụng nó đang chạy).

Trên hết, nếu bạn nhìn vào mã bên dưới, tôi mong đợi rằng sau 150 micro giây, thời gian scoped_lock trả về để cho tôi một lỗi .. nhưng đây không phải là trường hợp .. nó chỉ treo ở đó.

 #include <boost/interprocess/sync/named_mutex.hpp> 
     namespace bi = boost::interprocess; 
     bi::named_mutex m_mutex; 

try{ 
     boost::posix_time::ptime pt( 
      boost::posix_time::microsec_clock::local_time()) ; 

     pt+= boost::posix_time::microseconds(150); 
     bi::scoped_lock<bi::named_mutex> lock(m_mutex, pt); 

     if(!lock.owns()){ 
     FATAL("I didn't acquire the lock."); 
      return EXIT_FAILURE; 
     } 
    .... 

Câu hỏi của tôi như sau:

  1. Làm thế nào để đảm bảo rằng boost::interprocess tên mutex bị phá hủy? (do đó, làm thế nào để xem mutex được chia sẻ qua các quy trình và cách tiêu diệt chúng)
  2. Tại sao có được mutex không trả về sau 150 micro giây? Có bất cứ điều gì sai trái trong đoạn code dưới đây không?

Thanks a lot

AFG

Trả lời

4

Tôi tìm thấy giải pháp: Tôi bỏ lỡ để gọi sau để tiêu diệt các mutex

boost::interprocess::named_mutex::remove("MutexName"); 

Mã này làm cho tất cả các sạch cần thiết lên.

2
boost::interprocess::named_mutex::remove("MutexName"); 

Điều này không đúng. Điều này cũng sẽ mở khóa mutex cho tất cả các quy trình khác.

1

mutex được đặt tên sẽ không phát hành khi gặp sự cố trên Unix, hãy thử tăng :: interprocess :: file_lock thay thế. Khi sự cố xảy ra, khóa được nhả ra.

+0

Trong trường hợp của tôi, nó vẫn được mua trên Windows –

1

không sử dụng hàm local_time(), thay vì sử dụng universal_time(): boost :: posix_time :: ptime abs_time = boost :: posix_time :: microsec_clock :: universal_time() + boost :: posix_time :: mili giây (150);

scoped_lock locker (mutex, abs_time);

nếu xảy ra sự cố, bạn nên ghi lại tín hiệu sự cố và mở khóa tên_mutex hoặc có chuỗi làm bộ hẹn giờ để kiểm tra khóa chết và mở khóa.

sử dụng tăng :: interprocess :: file_lock vấn đề mới sẽ được giới thiệu, cẩn thận !!!

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