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 : 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" );
            }
        }
    }
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

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