2014-08-29 9 views
5

L'unico modo in cui potevo vedere come fare questo era provare ad accedervi e catturare l'eccezione che viene lanciata se non c'è.Esiste un modo migliore per verificare l'esistenza di un segmento di memoria condivisa boost?

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; 
} 

C'è un modo migliore?

risposta

2

Stavo giocando con boost :: interprocess e mi è capitato di fare la stessa domanda. Ho fatto un po 'di scavo prima di sistemarmi su open_or_create per i miei bisogni. Tuttavia, nel profondo delle viscere di spaghetti di modello che è spinta (il mio è 1,62), troviamo questo gioiello:

 /*<... 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 ...> */ 

Quanto sopra è da managed_open_or_create_impl.hpp intorno alla riga 360, nel metodo priv_open_or_create(). Sembra che la risposta sia no. No, non c'è un buon modo per verificare se è stata creata una memoria condivisa prima di tentare di aprirla.