自定义的互斥量类,可以用于线程或进程的同步

来源:互联网 发布:多元非线性拟合算法 编辑:程序博客网 时间:2024/05/17 23:38
#ifndef __MUTEX_H
#define __MUTEX_H

#include

class CMutex
{
public:
    CMutex(LPCTSTR pszMutex)
    {
        SECURITY_ATTRIBUTES sa;
        sa.nLength = sizeof(sa);
        sa.lpSecurityDescriptor = NULL;
        sa.bInheritHandle = TRUE;
        m_hMutex = NULL;

        m_hMutex = ::OpenMutex(MUTEX_ALL_ACCESS, FALSE, pszMutex);
        if (NULL == m_hMutex)
        {
            m_hMutex = ::CreateMutex(NULL, FALSE, pszMutex);
        }
    }
    ~CMutex()
    {
        Unlock();
        ::CloseHandle(m_hMutex);
        m_hMutex        = NULL;
    }
public:
    VOID Lock()
    {
        DWORD dwResult;
        do
        {
            dwResult = ::WaitForSingleObject(m_hMutex, INFINITE);
        }while(dwResult != WAIT_OBJECT_0);

    }
    VOID Unlock()
    {
        if (NULL != m_hMutex)
        {
            DEBUG_MSG(TEXT("FreeMutex ..."));
            ::ReleaseMutex(m_hMutex);

        }
    }
private:
    static void DEBUG_MSG(LPCTSTR szFormat, ... )
    {
#ifdef _DEBUG        
        SYSTEMTIME stST;
        ::GetLocalTime(&stST);
        FILE *fFile = NULL;

        TCHAR szTmp[1024] = {0};
        char szMsg[1024]  = {0}, szTemp[1024] = {0};

        va_list valueList;
        va_start(valueList, szFormat);

        int nWrite = _vsntprintf((LPTSTR)szTmp, BUFSIZ, szFormat, valueList);
        va_end( valueList );             

        if( (fFile = fopen("c://DebugInfo.log", "a+" )) == NULL )
            return;
        ::WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)szTmp, -1, szMsg, 1024, NULL, NULL );

        fseek(fFile,0,SEEK_END);
        //fwrite(szMsg,strlen(szMsg),1,fFile);
        sprintf(szTemp, "%-80s%02d:%02d:%02d.%03d", szMsg,
            stST.wHour,
            stST.wMinute, 
            stST.wSecond, 
            stST.wMilliseconds);
        fwrite(szTemp,strlen(szTemp), 1, fFile);
        fwrite("/n",1,1,fFile);

        fclose(fFile);
#endif
    }
private:
    static HANDLE  m_hMutex;
};
HANDLE CMutex::m_hMutex = NULL;


#endif
原创粉丝点击