Je cherche une solution pour que ma boucle principale accède à une pile de messages (std::stack<Ogre::String> dernier entré premier sorti).
Les messages lus sont supprimés de la pile ( logique c'est une pile ).
J'ai un client ( boost::asio::ip::tcp ) qui récupère les messages du serveur de manière asynchrone et les ajoutes à la piles.

Je voudrais mettre cette pile de messages dans un mutex.
Je souhaite utiliser boost::mutex.

Est ce faisable même si je n'utilise pas boost::thread pour ma main loop ( boucle de rendu d'Ogre. )

Si oui comment le feriez vous, c'est la première fois que je fais joujou avec les mutex et j'ai un peu de mal à concevoir la chose pour le moment.

Voici quelques liens :
http://matthieu-brucher.developpez.c...st/thread/#LII
http://stackoverflow.com/questions/1...king-the-mutex

[EDIT]

Voici mon idée :

Headers:
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
 
            class MessagesStack : public Ogre::Singleton<Ca::Network::Tcp::MessagesStack>
            {
                public:
                    typedef std::stack<Ogre::String> Messages ;
 
                    /** Renvoi la copie de m_Messages et efface m_Messages
                    */
                    Ca::Network::Tcp::MessagesStack::Messages GetMessages() ;
 
                    /** Ajoute en bas de la pile un nouveau message
                    */
                    void PushMessage( const Ogre::String &inMessage ) ;
 
                    MessagesStack() ;
                    ~MessagesStack() ;
 
                    static Ca::Network::Tcp::MessagesStack& getSingleton() ;
                    static Ca::Network::Tcp::MessagesStack* getSingletonPtr() ;
 
                private:
                    Ca::Network::Tcp::MessagesStack::Messages m_Messages ;
 
                    boost::recursive_mutex m_Mutex ;
            };
Sources :
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
 
template<> Ca::Network::Tcp::MessagesStack* Ogre::Singleton<Ca::Network::Tcp::MessagesStack>::ms_Singleton = NULL ;
 
//////////////////////////////
/* MessagesStack            */
//////////////////////////////
 
Ca::Network::Tcp::MessagesStack::MessagesStack()
{}
 
Ca::Network::Tcp::MessagesStack::~MessagesStack()
{}
 
Ca::Network::Tcp::MessagesStack& Ca::Network::Tcp::MessagesStack::getSingleton()
{
    boost::recursive_mutex::scoped_lock aLock( m_Mutex ) ;
 
    M_ASSERT_NULL( ms_Singleton, "Ca::Network::Tcp::MessagesStack& Ca::Network::Tcp::MessagesStack::getSingleton()" )
    return ( *ms_Singleton ) ;
}
 
Ca::Network::Tcp::MessagesStack* Ca::Network::Tcp::MessagesStack::getSingletonPtr()
{
    boost::recursive_mutex::scoped_lock aLock( m_Mutex ) ;
 
    return ms_Singleton ;
}
 
Ca::Network::Tcp::MessagesStack::Messages GetMessages()
{
    boost::recursive_mutex::scoped_lock aLock( m_Mutex ) ;
 
    Ca::Network::Tcp::MessagesStack aMessages = m_Messages ;
 
    m_Messages = Ca::Network::Tcp::MessagesStack::Messages() ;
 
    return aMessages ;
}
 
void Ca::Network::Tcp::MessagesStack::PushMessage( const Ogre::String &inMessage )
{
    boost::recursive_mutex::scoped_lock aLock( m_Mutex ) ;
 
    m_Messages.push( inMessage )
 
}
EDIT:

Bon ça pas l'air d'être la logique. Je pense que je vais mettre m_Mutex en static et laisser les fonctions appelantes enrober l'appel d'un boost::recursive_mutex::scoped_lock aLock( m_Mutex ) ;

Dans getSingletonPtr() et getSingleton()

error: invalid use of member 'Ca::Network::Tcp::MessagesStack::m_Mutex' in static member function