刚学多线程,这是我在codeproject下的一个代码,我感觉作者写的这两个代码没有用,不知道是不是写错了,请指教//
//临界区变量声明,这个临界区只在下面两个函数中出现,
CCriticalSection m_critSection;
bool m_cancelBurn;//这是个刻录程序,Set函数来改变m_cancelBurn的值,Get函数通过获取m_cancelBurn的值来判断是否终止操作
//Set函数只在主线程出现,Get函数只在子线程出现,程序只有一个子线程
//我觉得两个函数都应该在初始化CSingleLock后Lock,才能达到同步的作用对吗void CBurnCDDlg::SetCancelBurning(bool bCancel)
{
    CSingleLock singleLock(&m_critSection);    m_cancelBurn = bCancel;
}bool CBurnCDDlg::GetCancelBurning()
{
    CSingleLock singleLock(&m_critSection);
    return m_cancelBurn;
}

解决方案 »

  1.   

    void CBurnCDDlg::SetCancelBurning(bool bCancel)
    {
        CSingleLock singleLock(&m_critSection);//这里需要调用Lock才能同步m_cancelBurn变量
        singleLock.Lock();
        m_cancelBurn = bCancel;
    }bool CBurnCDDlg::GetCancelBurning()
    {
        CSingleLock singleLock(&m_critSection,TRUE); //这里不需要调用Lock就能同步m_cancelBurn变量
        return m_cancelBurn;
    }
      

  2.   

    根据VC的源代码//CSingleLock的构造函数如下
    //声明
    CSingleLock(CSyncObject* pObject, BOOL bInitialLock = FALSE);
    //定义
    CSingleLock::CSingleLock(CSyncObject* pObject, BOOL bInitialLock)
    {
    ASSERT(pObject != NULL);
    ASSERT(pObject->IsKindOf(RUNTIME_CLASS(CSyncObject))); m_pObject = pObject;
    m_hObject = pObject->m_hObject;
    m_bAcquired = FALSE;
            //因为bInitialLock默认值为FALSE,以下不执行
    if (bInitialLock)
    Lock();
    }
    //以下是CCriticalSection类的实现
    //在构造函数里只是InitializeCriticalSection并没有EnterCriticalSection
    _AFXMT_INLINE CCriticalSection::CCriticalSection() : CSyncObject(NULL)
    { ::InitializeCriticalSection(&m_sect); }_AFXMT_INLINE CCriticalSection::~CCriticalSection()
    { ::DeleteCriticalSection(&m_sect); }_AFXMT_INLINE BOOL CCriticalSection::Lock()
    { ::EnterCriticalSection(&m_sect); return TRUE; }_AFXMT_INLINE BOOL CCriticalSection::Unlock()
    { ::LeaveCriticalSection(&m_sect); return TRUE; }这样就能给CCriticalSection变量加锁了吗???
      

  3.   

    你的理解是对的
    singleLock.Lock();
    会调用CCriticalSection::Lock()函数,所以可以给变量加锁了