CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 5 of 5

Threaded View

  1. #1
    Join Date
    Apr 2007
    Location
    Mars NASA Station
    Posts
    1,436

    Thread Safe Singleton Segmentation Fault

    Hello to all, i try to implement a thread safe singleton but it get segmentation fault after main exit.

    Below is my code:

    Code:
    Singleton Class
    // =====================================
    class ClsSqliteDatabaseManager : public ClsDatabaseManager
    {
    public:
        ~ClsSqliteDatabaseManager();
    
     static ClsSqliteDatabaseManager* CreateInstance();
     static ClsSqliteDatabaseManager* GetInstance();
     static void DestroyInstance(ClsConnectionPool&);
    
    private:
        ClsSqliteDatabaseManager();
    
    private:
        ClsConnectionPool m_ConnPool;
        IsNeutralMap m_IsNeutralMap;
    
        static mutex m_Mutex;
        static recursive_mutex m_RecurMutex;
        static condition_variable m_CondVar;
    
        static ClsSqliteDatabaseManager* m_DbManager;
    
    
    };
    // =====================================
    Static Initialization in DBManager.cpp file
    
    ClsSqliteDatabaseManager* ClsSqliteDatabaseManager::m_DbManager = 0;
    
    mutex ClsSqliteDatabaseManager::m_Mutex;
    recursive_mutex ClsSqliteDatabaseManager::m_RecurMutex;
    
    condition_variable ClsSqliteDatabaseManager::m_CondVar;
    
    
    Implementation
    // ===========================================
    ClsSqliteDatabaseManager* ClsSqliteDatabaseManager::CreateInstance()
    {
        unique_lock<mutex> lock(m_Mutex);
    
        if (m_DbManager == 0)
        {
            m_DbManager = new ClsSqliteDatabaseManager();
            m_CondVar.notify_all();
        }
    
        return m_DbManager;
    }
    
    void ClsSqliteDatabaseManager::DestroyInstance(ClsConnectionPool& ConnPool)
    {
        unique_lock<mutex> lock(m_Mutex);
    
        // Close all DB connection in the conn pool
        // This statement same with m_ConnPool.CloseAllConn();
        ConnPool.CloseAllConn();
    
        ConnPool.FreeSessionMemory();
    
        delete m_DbManager;
    }
    
    ClsSqliteDatabaseManager* ClsSqliteDatabaseManager::GetInstance()
    {
        if (m_DbManager == 0)
        {
            unique_lock<mutex> lock(m_Mutex);
    
            m_CondVar.wait(lock);
        }
    
        return m_DbManager;
    }
    // =======================================
    Main.cpp
    
    int main()
    {
        cout << "Hello World" << endl;
        Json::Value value;
        ClsDatabaseManager* dbManager = ClsSqliteDatabaseManager::CreateInstance();
    
        ClsSqliteDatabaseManager::DestroyInstance(dbManager->GetConnectionPool());
    
        return 0;  // Segmentation Fault Here
    I try to debug using gdb and backtrace it shows on line return 0 in Main.cpp
    I try to remove the static mutex in the singleton DB Manger class but it still casue segmentation fault.
    Is it the local variable in single Db Manager class that cause this problem.

    Please suggest a solution which thread safe and no segmentation fault.
    Please help .

    Thanks.
    Last edited by Peter_APIIT; November 1st, 2010 at 04:48 AM.
    Thanks for your help.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  





Click Here to Expand Forum to Full Width

Featured