Usage de Singleton de Boost::Detail::Thread ?

Usage de Singleton de Boost::Detail::Thread ? - C++ - Programmation

Marsh Posté le 21-05-2008 à 18:23:09    

Quelqu'un sait il comment utiliser la class singleton (de Boost :: Detail :: Thread ) ?
 
J'ai cherché sur le net, le seul lien c'est http://sprinkleofcocoa.blogspot.co [...] class.html et très franchement, je comprend mal sa facon de l'utiliser, c'est pas clair.
 
Alors si quelqu'un l'a deja implémentée, pourrait il me dire ?
 

Code :
  1. // Copyright (C) 2001-2003
  2. // Mac Murrett
  3. //
  4. // Distributed under the Boost Software License, Version 1.0. (See
  5. // accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt)
  7. //
  8. // See http://www.boost.org for most recent version including documentation.
  9. #ifndef BOOST_SINGLETON_MJM012402_HPP
  10. #define BOOST_SINGLETON_MJM012402_HPP
  11. #include <boost/thread/detail/config.hpp>
  12. namespace boost {
  13. namespace detail {
  14. namespace thread {
  15. // class singleton has the same goal as all singletons: create one instance of
  16. // a class on demand, then dish it out as requested.
  17. template <class T>
  18. class singleton : private T
  19. {
  20. private:
  21.     singleton();
  22.     ~singleton();
  23. public:
  24.     static T &instance();
  25. };
  26. template <class T>
  27. inline singleton<T>::singleton()
  28. {
  29.     /* no-op */
  30. }
  31. template <class T>
  32. inline singleton<T>::~singleton()
  33. {
  34.     /* no-op */
  35. }
  36. template <class T>
  37. /*static*/ T &singleton<T>::instance()
  38. {
  39.     // function-local static to force this to work correctly at static
  40.     // initialization time.
  41.     static singleton<T> s_oT;
  42.     return(s_oT);
  43. }
  44. } // namespace thread
  45. } // namespace detail
  46. } // namespace boost
  47. #endif // BOOST_SINGLETON_MJM012402_HPP


Message édité par NounouRs le 21-05-2008 à 18:23:43
Reply

Marsh Posté le 21-05-2008 à 18:23:09   

Reply

Marsh Posté le 21-05-2008 à 18:36:35    

pas sur que singleton soit utilisable publiquement vu sa presence dans le namespace detail.
 
sinon ca doit etre un truc genre
 

Code :
  1. MaClasse& i = singleton<MaClasse>::instance();
  2. i.foo();


 
ou MaClasse est la classe que tu veut transformer en singleton.
En outre, ce singleton ets tout sauf thread-safe car pas de double locking dans instance().

Reply

Marsh Posté le 22-05-2008 à 08:50:35    

Justement, j'avais dans l'idée de faire un code un peu comme ca :

Code :
  1. //Idée de singleton à finir de templatiser ... pourquoi faire ?
  2. //Probleme possible les pointeurs ???
  3. // T.h:
  4. template<typename T> class Singleton
  5.   {
  6.   public:
  7.     static T* instance();
  8.   private:
  9.     T() {}
  10.     ~T() {}
  11.     static T* smInstance;
  12.     static VMutex smMutex;
  13.   };
  14. // T.cpp:
  15. T* T::smInstance = NULL;
  16. VMutex T::smMutex;
  17. T* T::instance()
  18.   {
  19.   if (smInstance == NULL)
  20.     {
  21.     VMutexLocker lock(&smMutex);
  22.  
  23.     if (smInstance == NULL) // double-check
  24.       smInstance = new T();
  25.     }
  26.   return smInstance;
  27.   }


 
Mais  je suis en train d'heister sur la methode : dois en faire un template, et pourquoi ?  J'ai recopié une partie de ce code sur un site, donc je comprend pas bien l'utilité de la structure

Reply

Marsh Posté le 22-05-2008 à 09:18:10    

le but d'une classe singleton template est d'encapsuler la *fonctionnalité* singleton et la séparer de son *contenu* effectif. En gros, tu écris une classe normal qui a des membres, des méthodes etc ... et tu instancie un singleton à partir de cette derniére.

 

Si A est ta classe, singleton<A> est une classe de même contenu et interface que A mais avec un comportement de singleton.

 

http://www.research.ibm.com/design [...] -jun96.txt
http://www.codeproject.com/cpp/singleton.asp


Message édité par Joel F le 22-05-2008 à 09:18:24
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed