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.
l'argument name contient le nom de la zone mémoire et est préfixé par "Global\"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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" ); } } }
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
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
Partager