关于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();
}
}
这样修改后,程序好用了。可是为什么这样改后程序就好用了呢?
开始以为数据能够很快被处理完,就锁定了整个函数段。看来问题就出现在这里了啊。线程间的同步时,如果锁定的数据要很长时间才能处理完,这样的话就很容易造成死锁。所以不要那么用哦。
欢迎大家谈谈对线程同步的认识!
起初以为是数据库的问题。可是在我的机器上程序操作数据库就正常,为什么放到服务器上就出问题呢。不会是调用的函数在两个系统上不兼容出现的问题吧,经过半天的查找,这个想法被否定了。那就只能跟踪调试喽(水平所限,不要笑我啊)。
在本机上正常!
怎么调试啊?
……
不说废话了,呵呵。
原先的程序在线程同步的时候用的是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();
}
}
这样修改后,程序好用了。可是为什么这样改后程序就好用了呢?
开始以为数据能够很快被处理完,就锁定了整个函数段。看来问题就出现在这里了啊。线程间的同步时,如果锁定的数据要很长时间才能处理完,这样的话就很容易造成死锁。所以不要那么用哦。
欢迎大家谈谈对线程同步的认识!
相关文章推荐
- 关于使用EnterCriticalSection思考
- CSemaphore/CMutex/CCriticalSection/CEvent区别
- CMutex、CCriticalSection、CSemaphore、CEvent、WaitForSingleObject 的小例子
- CSemaphore/CMutex/CCriticalSection/CEvent区别
- 关于多线程与CRITICAL_SECTION的使用
- CSemaphore/CMutex/CCriticalSection/CEvent之间区别
- 关于多线程同步的几点疑问(以CRITICAL_SECTION 为例)
- 关于CRITICAL_SECTION、CCriticalSection和信号量的问题
- CSemaphore/CMutex/CCriticalSection/CEvent区别
- 关于 windows 互斥锁CRITICAL_SECTION 多次加锁,需要多少释放的问题
- 关于CRITICAL_SECTION的问题
- 【转】CSemaphore/CMutex/CCriticalSection/CEvent之间有什么区别
- 关于多线程同步的几点疑问(以CRITICAL_SECTION 为例)
- 关于CRITICAL_SECTION的一些理解
- 关于CRITICAL_SECTION、CCriticalSection和信号量的问题
- 关于同一线程两次调用EnterCriticalSection的测试
- 淘宝安全团队高手关于信息安全发展的看法,很有启迪!
- 【VC报错】LeaveCriticalSection中断异常
- 关于对 membership role profile provider 的使用及看法
- 关于比特币的粗浅看法