CreateFileMapping - Création d'un singleton pour plusieurs process.
J'essaie depuis ce matin de créer un singleton qui soit thread-safe, mais qui offrent la possibilité d'être employée à travers plusieurs processus.
Pour cela, j'utilise CreateFileMapping et MapViewOfFile.
Mon singleton pour le moment, n'utilise encore rien pour la synchronisation mais ça viendra par après.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
static void create( const std::string & name ) {
if( !mInstance ) {
HANDLE hMapFile = CreateFileMapping( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof( T ), name.c_str() );
if( hMapFile != NULL ) {
int last_error = GetLastError();
LPVOID ptr( MapViewOfFile( hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, sizeof( T ) ) );
if( last_error == ERROR_ALREADY_EXISTS ) {
/// On récupère l'adresse pour mInstance
mInstance = reinterpret_cast< T * >( ptr );
if( !mInstance ) {
throw std::runtime_error( "Erreur dans le Singleton " + name );
}
}
else {
/// Sinon, on alloue mInstance
mInstance = new( ptr ) T();
}
UnmapViewOfFile(ptr);
CloseHandle( hMapFile );
}
else {
throw std::runtime_error( "Impossible de réaliser le CreateFileMapping" );
}
}
} |
l'argument name contient le nom de la zone mémoire et est préfixé par "Global\"
Le problème que j'ai, est que quoi que je fasse :p J'obtiens toujours des instances différentes de mon singleton, et étant donné qu'il s'agit de ma pièce maitresse, j'ai un léger problème :D
Est-ce quelqu'un aurait une idée ???
Creating Named Shared Memory => http://msdn2.microsoft.com/en-us/library/aa366551.aspx
CreateFileMapping => http://msdn2.microsoft.com/en-us/library/aa366537.aspx
MapViewOfFile => http://msdn2.microsoft.com/en-us/library/aa366761.aspx