一种线程安全的单例模式实现

#include <iostream>
#include <vector>
#include <bitset>
#include <assert.h>
#include <Windows.h>
#include <process.h>


using namespace std;


class CSingleton
{
private:
    class CAssistForSingleton
    {
    private:
        CRITICAL_SECTION m_cs;


    public:
        CAssistForSingleton()
        {
            InitializeCriticalSection(&m_cs);
        }


        ~CAssistForSingleton()
        {
            DeleteCriticalSection(&m_cs);
        }


    public:
        void Lock()
        {
            EnterCriticalSection(&m_cs);
        }


        void UnLock()
        {
            LeaveCriticalSection(&m_cs);
        }
    };


private:
    static CAssistForSingleton m_refSycObj;
    static CSingleton *m_pInstance;


    static int m_nData;


private:
    CSingleton()
    {


    }


public:
    static CSingleton *GetInstatnce()
    {
        m_refSycObj.Lock();
        if (NULL == m_pInstance)
        {
            m_pInstance = new CSingleton;
            cout<<"new CSingleton"<<endl;
        }
        m_refSycObj.UnLock();


        return m_pInstance;
    }


public:
    static int GetData() 
    {
        return m_nData;
    }


    static void SetData(int nData)
    {
        m_refSycObj.Lock();
        m_nData = nData;
        m_refSycObj.UnLock();
    }
};


CSingleton::CAssistForSingleton CSingleton::m_refSycObj = CSingleton::CAssistForSingleton();
CSingleton *CSingleton::m_pInstance = NULL;
int CSingleton::m_nData = 0;


unsigned int WINAPI ThreadFun(void *)
{
    cout<<"Launcher Thread"<<endl;
    
    for(int i = 0 ; i < 99999999 ; i++)
    {
        CSingleton *pSingl = CSingleton::GetInstatnce();
        if (NULL != pSingl)
        {
            pSingl->SetData(i);
        }


        Sleep(500);
    }


    return 0;
}


int main(int argv, char *argc[])
{
    uintptr_t HandleThread[10];
    unsigned int nThreadId = 0;
    for(int i = 0 ; i < 10 ; i++)
    {
        HandleThread[i] = _beginthreadex(NULL, 0, ThreadFun, NULL, 0, &nThreadId);
    }


    WaitForMultipleObjects(10, (const HANDLE *)HandleThread, TRUE, INFINITE);


    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值