程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> singleton-多線程下Singleton模式

singleton-多線程下Singleton模式

編輯:編程綜合問答
多線程下Singleton模式
 //singleton.h

#ifndef _SINGLETON_H_
#define _SINGLETON_H_

#include "synobj.h"

template<typename T> 
class Singleton
{
public:
    static T* Instance();

protected:

private:
    Singleton();
    ~Singleton();
    Singleton(Singleton& );
    Singleton& operator = (Singleton& );
    static void Destory();

private:
    static T*  _instance;
    static Mutex _mutex;
};
 //singleton.cpp

//volatile的作用是: 作為指令關鍵字,確保本條指令不會因編譯器的優化而省略,且要求每次直接讀值.

#include "stdafx.h"
#include "singleton.h"
#include <iostream>
#include <stdlib.h>

using namespace std;

template<typename T> T*  Singleton<T>::_instance = NULL;
template<typename T> Mutex Singleton<T>::_mutex;

template<typename T>
Singleton<T>::Singleton()
{

}

template<typename T> 
Singleton<T>::~Singleton()
{

}

template<typename T> 
T* Singleton<T>::Instance()
{
    if(_instance == NULL )
    {
        Lock lock(_mutex);
        if(_instance == NULL)
        {
            T* temp = new T;
            _instance = temp;
            //_instance = new T();
            atexit(Destory);
        }
    }
    return _instance;
}

template<typename T>
void Singleton<T>::Destory()
{
    if(NULL != _instance)
    {
        delete _instance;
        _instance = NULL;
    }
}
 // Singleton20.cpp : 定義控制台應用程序的入口點。
//

#include "stdafx.h"
#include "singleton.h"
#include "synobj.h"
#include <stdio.h>
#include <iostream>

using namespace std;

class A:public Singleton<A>
{
public:
    void DoSomething()
    {
        cout<<"hello DoSomething"<<endl;
    }

};


int _tmain(int argc, _TCHAR* argv[])
{
    A* a = A::Instance();
    a->DoSomething();

    getchar();
    return 0;
}

圖片說明
我的代碼大致是這樣的,各位前輩們,幫忙分析一下我的錯誤吧。。。。

最佳回答:


用模板類的實現應該寫在.h裡面,最好是將.h命名成.hpp,你看看boost裡面的頭文件基本都是.hpp
這個其實是因為模板在編譯的時候並沒有實例化,看下這個文章吧c++模板類(一)理解編譯器的編譯模板過程

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved