功能肯定一样对不? 实现上有什么不同吗? 有没有在EnterCriticalSection()/LeaveCriticalSection()之外做什么事情?

解决方案 »

  1.   

    这也算问题啊 你自己看一下CComCriticalSection的实现代码 就那么几行
    只是为了方便而已 这个类 
      

  2.   


    class CComCriticalSection
    {
    public:
    CComCriticalSection() throw()
    {
    memset(&m_sec, 0, sizeof(CRITICAL_SECTION));
    }
    ~CComCriticalSection()
    {
    }
    HRESULT Lock() throw()
    {
    EnterCriticalSection(&m_sec);
    return S_OK;
    }
    HRESULT Unlock() throw()
    {
    LeaveCriticalSection(&m_sec);
    return S_OK;
    }
    HRESULT Init() throw()
    {
    HRESULT hRes = E_FAIL;
    __try
    {
    InitializeCriticalSection(&m_sec);
    hRes = S_OK;
    }
    // structured exception may be raised in low memory situations
    __except(STATUS_NO_MEMORY == GetExceptionCode())
    {
    hRes = E_OUTOFMEMORY;
    }
    return hRes;
    } HRESULT Term() throw()
    {
    DeleteCriticalSection(&m_sec);
    return S_OK;
    }
    CRITICAL_SECTION m_sec;
    };
    以上是CComCriticalSection的代码。
    EnterCriticalSection()/LeaveCriticalSection()指临界区。
    如果一个线程调用了EnterCriticalSection(&m_sec);然后继续处理,在未调用LeaveCriticalSection(&m_sec)。
    这时另一个线程也调用了EnterCriticalSection(&m_sec);,这个时间由于第一个线程未调用LeaveCriticalSection(&m_sec),那么这个线程就会一直阻塞在EnterCriticalSection(&m_sec);不会往下走流程了,直到第一个线程调用LeaveCriticalSection(&m_sec)。
    这样,两个线程中EnterCriticalSection()/LeaveCriticalSection()之间的代码同一时间只能有一个线程进行处理,这对访问共享资源来说是很必要的。
    当然两个调用调用EnterCriticalSection()/LeaveCriticalSection()的时候,传递的参数m_sec要是同一个,不然不起作用。