您的位置:首页 > 编程语言 > C语言/C++

多线程下的C++ 单例模式

2012-06-23 20:16 274 查看
c++ 实现多线程安全下的单例模式

    多线程环境下的输出日志到标准输出

    

    首先我们需要一个锁类能够自动初始化,并且降低耦合。

     /*

     * lock.h

     * created on :2012-06-23

     */

     #ifndef   LOCK_H

     #define  LOCK_H

     class  locker

     {

     public:

            inline locker( )  //构造函数

            {

                    pthread_mutex_init(&mutex,NULL);

            }

           

           inline  ~locker( ) //析构函数

            {

                   pthread_mutex_destroy(&mutex);

            }

     public:

            inline  lock( )

            {

                  pthread_mutex_lock(&mutex);

            }

            inline unlock()

            {

                  pthread_mutex_unlock(&mutex);

            }

     private:

            pthread_mutex_t   mutex;

     };

     #endif     /*LOCK_H*/

 

     其次,声明日志类,重点是将构造函数,拷贝构造函数,重载的赋值操作符私有化,将函数成员和数据成员声明为静态,添加实例指针和全局访问点。

      /*

      *    log.h

      *    created on:2012-06-23

      */

      #include "locker.h"

 

      class   tinylog

      {

       public:

               static tinylog  * getInstance();

               static void WriteLog(const char *format,......);

       private:

               tinylog ();  //构造函数

               tinylog(const  tinylog &);  //拷贝构造函数

               tinylog & operator = (const tinylog &); //重载的赋值操作符函数

               static  tinylog * log;

               static locker  llock;

       private:

               class  CGarbo //它的唯一工作是在析构函数中删除类tinylog的实例。

               {

               public:

                      inline  ~CGarbo( )

                      {

                              if(tinylog::log)

                             {

                                     delete  tinylog::log;

                             }

                      }

               }

               static CGarbo   Garbo; //定义的静态成员,在程序结束时,系统会调用它的析构函数.

     }

 

     然后是日志类的实现,注意全局访问点中使用double check提高性能。

     /*

     *  log.cpp

[b]     *  created on:2012-06-23


     */

     #include "log.h"

     tinylog * tinylog::log = NULL;

     tinylog  tinylog::llock;

     tinylog::tinylog( )

     {

      ..................

     }

 

     tinylog::tinylog(const tinylog & tg)

     {

           .............

     }

 

     tinylog & tinylog::operator = (const tinylog & tg)

     {

           .....................

     }

    

     tinylog *  tinylog::getInstance( )

     {

           if(log == NULL)

           {

                llock.lock();

                if(log == NULL)

                {

                        log = new  tinylog();

                }

                llock.unlock();

           }

           return log;

    }

    

    void  tinylog::WriteLog(const char * format,....)

    {

          va_list  args;

          va_start(args,format);

          llock.lock();

          vfprintf(stdout,FORMAT,args);

         llock.unlock();

         va_end(args);

    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息