|
-
November 1st, 2010, 04:41 AM
#1
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
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|