class single
{
   private:
       static single *s_pInstance;
       single();
   public:
       static single getInstance()
            {
              if(s_pInstance==NULL)
                {
                  s_pInstance=new single();
                }
              return s_pInstance;
            }
};
请问,这个类如果用在多线程中会存在什么问题,如何避免?

解决方案 »

  1.   

    多线程访问的都是s_pInstance 这一个singleton对象,所以需要做同步处理,防止多个线程同时操作 s_pInstance
      

  2.   

          static single getInstance() 
                { 
    EnterCriticalSection(...)
                  if(s_pInstance==NULL) 
                    { 
                      s_pInstance=new single(); 
                    } 
    LeaveCriticalSection(...)
                  return s_pInstance; 
                } 
      

  3.   

    会有问题,有可能在初始化的时候2个线程一起调用这个函数,会调用new single(); 2次。参见LS的临界区加锁办法。不过那样的话,每次调用getInstance都会进入临界区,影响效率。我觉得更好一点的办法是写成2个函数:
    static single* getInstance() 

    if(s_pInstance==NULL) 

    newInstance(); 

    return s_pInstance; 

    static void newInstance() 
    {
    EnterCriticalSection(...); 
    if(s_pInstance==NULL) 

    s_pInstance=new single(); 

    LeaveCriticalSection(...);
    }