CCriticalSection锁定问题 [英] CCriticalSection Locking problem

查看:128
本文介绍了CCriticalSection锁定问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

你好

我正在MFC中开发一个多线程应用程序.我使用CCriticalSection对象进行互斥.我已经意识到,有时2个线程可以访问同一对象.以下代码检查那里是否没有其他线程在工作.如果是这样,我让 应用程序崩溃.如果在WinDBG中进行调试,则可以看到CRITICAL_SECTION对象的成员. LockCount ist 2,并且拥有的线程不是我的!这怎么可能?

I am developing a multithreaded application in MFC. I use a CCriticalSection object for mutual excusion. I have realised, that sometimes 2 threads gain the access to the same object. Following code checks if no other thread is working there. If so, I let the application crash. If I debug in WinDBG I can see the members of CRITICAL_SECTION object. The LockCount ist 2, and the owning thread is other than mine! How could this be possible?

Bronjek

void CRef :: Lock()

void CRef::Lock()

{

    //CCriticalSection :: Lock始终返回TRUE

    // CCriticalSection::Lock allways returns TRUE

   布尔bRet = m_csLock.Lock();

    BOOL bRet = m_csLock.Lock();

    m_dLockCount ++;

    m_dLockCount++;

   如果(0 == m_dLasLockThreadId)

    if (0 == m_dLasLockThreadId)

    {

    {

        m_dLasLockThreadId = GetCurrentThreadId();

        m_dLasLockThreadId = GetCurrentThreadId();

    }

    }

   否则((0< m_dLockCount)&&(m_dLasLockThreadId!= GetCurrentThreadId()))

    else if ((0 < m_dLockCount) && (m_dLasLockThreadId != GetCurrentThreadId()))

    {

    {

//导致空指针异常

*((long *)NULL)= 0;

*((long *) NULL) = 0;

    }

    }

};

 

void CRef :: Unlock()

void CRef::Unlock()

{

如果(m_dLockCount< = 0)

if (m_dLockCount <= 0)

{

//导致空指针异常

*((long *)NULL)= 0;

*((long *) NULL) = 0;

}

    m_dLockCount-;

    m_dLockCount--;

   如果(m_dLasLockThreadId!= GetCurrentThreadId())

    if (m_dLasLockThreadId != GetCurrentThreadId())

    {

    {

//导致空指针异常

*((long *)NULL)= 0;

*((long *) NULL) = 0;

 

    }

    }

   如果(0 == m_dLockCount)m_dLasLockThreadId = 0;

    if (0 == m_dLockCount) m_dLasLockThreadId = 0;

   布尔bRet = m_csLock.Unlock();

    BOOL bRet = m_csLock.Unlock();

};

推荐答案

我认为这是您代码中的错误.

I think it is a bug in your code.

考虑顺序:

线程1:

lock()

线程2:

lock(),

这本身将触发您在上面描述的情况.

This itself will trigger the condition you describe above.

在知道要允许锁定之前,您正在递增m_dLockCount.因此,当线程2要求锁定时,count可以为2,这将触发您的异常.

You are incrementing the m_dLockCount, before you know that you want to allow the locking. Thus, count can be 2, while thread 2 is asking for the lock, which triggers your exception.

只需从最后一个if中删除锁计数检查即可.

Just remove the lock count check from the last else if.

更改:

否则((0< m_dLockCount)&&(m_dLasLockThreadId!= GetCurrentThreadId()))

else if ((0 < m_dLockCount) && (m_dLasLockThreadId != GetCurrentThreadId()))

收件人:

否则((m_dLasLockThreadId!= GetCurrentThreadId())

else if (m_dLasLockThreadId != GetCurrentThreadId())

///例外

其他

m_dLockCount ++;

m_dLockCount++;

 

谢谢

拉胡尔

 


这篇关于CCriticalSection锁定问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆