前一段时间写的一个程序,在我和几个人的机器上运行正常,在服务器上也运行了一段时间了。突然被告知数据库换了以后,程序运行就不正常了:通过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();
}
}
 
这样修改后,程序好用了。可是为什么这样改后程序就好用了呢?
开始以为数据能够很快被处理完,就锁定了整个函数段。看来问题就出现在这里了啊。线程间的同步时,如果锁定的数据要很长时间才能处理完,这样的话就很容易造成死锁。所以不要那么用哦。
欢迎大家谈谈对线程同步的认识!