您的位置:首页 > 职场人生

关于CRITICAL_SECTION与 CMutex 的看法

2008-05-09 13:07 183 查看
前一段时间写的一个程序,在我和几个人的机器上运行正常,在服务器上也运行了一段时间了。突然被告知数据库换了以后,程序运行就不正常了:通过socket收到数据帧后没有操作数据库,或者有的数据帧不操作数据库。
起初以为是数据库的问题。可是在我的机器上程序操作数据库就正常,为什么放到服务器上就出问题呢。不会是调用的函数在两个系统上不兼容出现的问题吧,经过半天的查找,这个想法被否定了。那就只能跟踪调试喽(水平所限,不要笑我啊)。
在本机上正常!
怎么调试啊?
……
不说废话了,呵呵。
原先的程序在线程同步的时候用的是CRITICAL_SECTION 对象,通过EnterCriticalSection()和LeaveCriticalSection()函数进行线程之间的同步。在线程中的应用如下所示:
CRITICAL_SECTION m_cs;
ThreadFunction1()
{
EnterCriticalSection(&m_cs);
Function1();
LeaveCriticalSection(&m_cs);
}

ThreadFunction2()
{
EnterCriticalSection(&m_cs);
Function2();
LeaveCriticalSection(&m_cs);
}

Function1()
{
//do something
}

Function2()
{
//do something
}

修改后的程序不再使用CMutex 类对象。通过 CSingleLock 的锁定与解锁进行同步,应用如下:
Cmutex m_mutex;
ThreadFunction1()
{
Function1();
}

ThreadFunction2()
{
Function2();
}

Function1()
{
CSingleLock
ls(&m_mutex);
//do something
If(WAIT_OBJECT_0 ==
WaitForSingleObject((HANDLE)m_mutex,INFINITE))
{
ls.Lock();
// update key
data
Ls.Unlock();
}
}

Function2()
{
CSingleLock ls(&m_mutex);
//do something
If(WAIT_OBJECT_0 ==
WaitForSingleObject((HANDLE)m_mutex,INFINITE))
{
ls.Lock();
// update key
data
Ls.Unlock();
}
}

这样修改后,程序好用了。可是为什么这样改后程序就好用了呢?
开始以为数据能够很快被处理完,就锁定了整个函数段。看来问题就出现在这里了啊。线程间的同步时,如果锁定的数据要很长时间才能处理完,这样的话就很容易造成死锁。所以不要那么用哦。
欢迎大家谈谈对线程同步的认识!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息