2014-08-29 18 views
5

Bunu nasıl yapabildiğimi görebilmemin tek yolu, ona erişmeyi denemek ve orada olmadığında atılan istisnayı yakalamaktı.Yükseltilmiş bir paylaşımlı bellek segmentinin varlığını kontrol etmek için daha iyi bir yol var mı?

bool exists() 
{ 
    using namespace boost::interprocess; 
    try 
    { 
     managed_shared_memory segment(open_only, kSharedMemorySegmentName); 
     return segment.check_sanity(); 
    } 
    catch (const std::exception &ex) { 
     std::cout << "managed_shared_memory ex: " << ex.what(); 
    } 
    return false; 
} 

Daha iyi bir yolu var mı?

cevap

2

Boost :: interprocess ile oynuyordum ve aynı soruyu soruyordum. Son olarak, ihtiyaçlar için open_or_create'a yerleşmeden önce biraz kazı yaptım. Ancak, derin şablon spagetti bağırsakları artırmak (madeni 1.62 olan) olduğu, bu taş bulmak:

 /*<... snip ...>*/ 
    //This loop is very ugly, but brute force is sometimes better 
    //than diplomacy. If someone knows how to open or create a 
    //file and know if we have really created it or just open it 
    //drop me a e-mail! 
    bool completed = false; 
    spin_wait swait; 
    while(!completed){ 
     try{ 
      create_device<FileBased>(dev, id, size, perm, file_like_t()); 
      created  = true; 
      completed = true; 
     } 
     catch(interprocess_exception &ex){ 
      if(ex.get_error_code() != already_exists_error){ 
       throw; 
      } 
      else{ 
       try{ 
       DeviceAbstraction tmp(open_only, id, read_write); 
       dev.swap(tmp); 
       created  = false; 
       completed = true; 
       } 
       catch(interprocess_exception &e){ 
       if(e.get_error_code() != not_found_error){ 
        throw; 
       } 
       } 
       catch(...){ 
       throw; 
       } 
      } 
     } 
     catch(...){ 
      throw; 
     } 
     swait.yield(); 
    } 

    /* <... snip ...> */ 

yukarıda priv_open_or_create() yönteminde, hat 360 yaklaşık olarak managed_open_or_create_impl.hpp arasındadır. Cevap hayır gibi görünüyor. Hayır, paylaşmaya çalışılmadan önce paylaşılan bir belleğin oluşturulup oluşturulmadığını kontrol etmenin iyi bir yolu yoktur.

İlgili konular