多线程 Mutex 的运用

Posted on 2011-05-23 14:46 CyberC++ 阅读(108) 评论(0)  编辑 收藏 引用 所属分类: C++ Language

 

    HANDLE m_hMutex;

    m_hMutex 
= CreateMutex(NULL, false, NULL ); 
    
if (!m_hMutex)
    
{
        
char cBuffer[1024];
        sprintf_s(cBuffer, 
1024"  Unable to create a mutex. Error: %d", GetLastError());
        LOG(
2, cBuffer);
    }


    
if (m_hMutex)
    
{
        CloseHandle(m_hMutex); 
    }


    
while ((r = WaitForSingleObject(m_hMutex, 5000)) != WAIT_OBJECT_0)
    
{
        
char cBuffer[1024];
        
switch (r)
        
{
        
case WAIT_TIMEOUT:
            sprintf_s(cBuffer, 
1024"  Backup system account lock failed (timeout). Locked by %s (%d), request from %s (%d)"
                m_sLockFile.c_str(), m_unLockLine, 
                sFile.c_str(), unLine);
            LOG(
2, cBuffer);
            
break;
        
case WAIT_ABANDONED:
            sprintf_s(cBuffer, 
1024"  Backup system account lock failed (abandoned). Locked by %s (%d), request from %s (%d)"
                m_sLockFile.c_str(), m_unLockLine, 
                sFile.c_str(), unLine);
            LOG(
2, cBuffer);
            
break;
        
case WAIT_FAILED:
            sprintf_s(cBuffer, 
1024"  Backup system account lock failed (failed: %d). Locked by %s (%d), request from %s (%d)"
                GetLastError(),
                m_sLockFile.c_str(), m_unLockLine, 
                sFile.c_str(), unLine);
            LOG(
2, cBuffer);
            
break;
        
default:
            sprintf_s(cBuffer, 
1024"  Backup system account lock failed (unknown). Locked by %s (%d), request from %s (%d)"
                m_sLockFile.c_str(), m_unLockLine, 
                sFile.c_str(), unLine);
            LOG(
2, cBuffer);
            
break;
        }

    }



    
if (!ReleaseMutex(m_hMutex))
    
{
        
char cBuffer[1024];
        sprintf_s(cBuffer, 
1024"  Mutex release failed. Error: %d", GetLastError());
        LOG(
2, cBuffer);
    }