关于CRITICAL_SECTION与 CMutex 的看法
原创
©著作权归作者所有:来自51CTO博客作者qqinbaby的原创作品,谢绝转载,否则将追究法律责任
前一段时间写的一个程序,在我和几个人的机器上运行正常,在服务器上也运行了一段时间了。突然被告知数据库换了以后,程序运行就不正常了:通过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();
}
}
这样修改后,程序好用了。可是为什么这样改后程序就好用了呢?
开始以为数据能够很快被处理完,就锁定了整个函数段。看来问题就出现在这里了啊。线程间的同步时,如果锁定的数据要很长时间才能处理完,这样的话就很容易造成死锁。所以不要那么用哦。
欢迎大家谈谈对线程同步的认识!
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
关于Python中math 和 decimal 模块的解析与实践
本文将深入探讨这math 和 decimal 模块的基础知识,并通过实际的代码示例演示它们的用法。
开发者 高精度计算 Python math 数学函数