1. 程式人生 > >C++再論單例模式

C++再論單例模式

proc .text pro auto -c com hide lock views

#include <iostream>
#include <windows.h>
#include <mutex>
std::mutex gmutex;
using namespace std;

template<typename Type>
class Singleton
{
public:
    static Type* GetSingleton()
    {   
        if (siglen == NULL)
        {
            unique_lock<std::mutex> lock(gmutex);//C++11加鎖。
if (siglen == NULL) { siglen = new Type(); Type *temp = new Type(); MemoryBarrier(); siglen = temp; } } return siglen; } private: static Type* siglen; }; template<typename
Type> Type* Singleton<Type>::siglen = NULL; class Text { public: Text() { data = 100; //由於是單例模式。所以唯一會出現申請內存。調用構造 //函數。賦值三個步驟混亂的機會僅僅有在前面的1-2次 //的時候。可惜速度太快了。這樣的情況發生的概率及其低 //,可是我們的心理要始終明確。

} void Printf() { cout << "data="<<data << endl; } static

DWORD WINAPI ThreadFunc(LPVOID arg) { Singleton<Text>::GetSingleton()->Printf(); return DWORD(0); } private: int data; }; int main() { HANDLE hThread; DWORD threadId; for (int i = 0; i < 10; i++) { hThread = CreateThread(NULL, 0, &(Text::ThreadFunc), (void *)"123",0, &threadId); } Sleep(5); cout << "ThreadFunc is running!!!" << endl; return 0; } #include <iostream> using namespace std; //引用計數的智能指針。 template<typename Type> class my_auto_ptr { public: my_auto_ptr(Type* p = NULL) :ptr(p) { count = new int[1]; count[0] = 1; } my_auto_ptr(const my_auto_ptr &ma) { count = ma.count; count[0]++; } my_auto_ptr& operator=(const my_auto_ptr &ma) { if (this != &ma) { this->~my_auto_ptr(); count = ma.count; count[0]++; ptr = ma.ptr; } return *this; } ~my_auto_ptr() { if (count!=NULL &&count[0]-- == 1) { cout << "~my_auto_ptr()" << endl; delete ptr; ptr = NULL; delete[] count; count = NULL; } } Type* operator->() { return ptr; } Type& operator*() { return *ptr; } private: Type *ptr; int *count; }; int main() { my_auto_ptr<int> ps(new int(100)); my_auto_ptr<int> pb(ps); my_auto_ptr<int> pd; pd = pb; return 0; }

C++再論單例模式