这是我的一个程序
DWORD WINAPI RecvThread(LPVOID lpParam)
{
HANDLE hObject        = NULL;
int    nLen           = 0;
int    nLimitQueueNum = 0;
DWORD  dwFlag         = 0;
DWORD  dwSendFlag     = 0;
DWORD  dwRecvFlag     = 0;
char   szBuffer[65532];
LONG   PreviousCount  = 0;
DWORD  dwResult       = 0;
LPHANDLE_OBJECT lpHandleObject = NULL;
DWORD  dwWrite;

ZeroMemory(szBuffer, 65533);
while (TRUE)
{
hObject = IOCOMP_GetNextPacket(szBuffer, 65532, &nLen, &dwFlag);
if (hObject == NULL)
{
continue;
}

switch(dwFlag)
{
case DATATYPE_LOGIN:
   dwResult = WaitForSingleObject(g_hSem, INFINITE);

IOCOMP_HandlePacketComplete(hObject, DATATYPE_LOGIN);
IOCOMP_SendPacket(hObject, szBuffer, nLen);

IOCOMP_DeliverRecv(hObject);
   ReleaseSemaphore(g_hSem, 1, &PreviousCount);
break;

case  DATATYPE_RECV_PACKET:   dwResult = WaitForSingleObject(g_hSem, INFINITE);
IOCOMP_HandlePacketComplete(hObject, DATATYPE_RECV_PACKET);
IOCOMP_SendPacket(hObject, szBuffer, nLen);
IOCOMP_DeliverRecv(hObject);
  ReleaseSemaphore(g_hSem, 1, &PreviousCount); break;

case DATATYPE_SEND_COMPLETE:

   dwResult = WaitForSingleObject(g_hSem, INFINITE);
IOCOMP_HandlePacketComplete(hObject, DATATYPE_SEND_COMPLETE);
   ReleaseSemaphore(g_hSem, 1, &PreviousCount); break;


case DATATYPE_THREAD_EXIT:
return 1;

case IO_ERROR: for (int i=0; i<g_nThreadcout; i++)
{
WaitForSingleObject(g_hSem, INFINITE);
}
IOCOMP_DestroySocket(hObject);
ReleaseSemaphore(g_hSem, g_nThreadcout, &PreviousCount);

break;
}


return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// g_hSem = CreateSemaphore(NULL, SysInfo.dwNumberOfProcessors*2, SysInfo.dwNumberOfProcessors*2, NULL);
if (g_hSem == NULL)
{
cout << "CreateSemaphore failed" << endl;
return;
}
g_nThreadcout = SysInfo.dwNumberOfProcessors*2;
在线程里,我的意图就是当IOCOMP_GetNextPacket的dwFlagc参数返回IO_ERROR后,把所有的信号量都等齐,然后再执行IOCOMP_DestroySocket,执行完IOCOMP_DestroySocket了再把信号量发出来
程序开始运行很正常,但是过了一段时间后,线程就死锁了。在线程里函数里去掉所有的WaitForSingleObject和ReleaseSemaphore语句后,就一切正常,不会死锁。上次我听有个朋友说好像信号量在WINDOWS下好像有点问题,,是这样的吗?
各位有没有遇到这种情况?

解决方案 »

  1.   

    不是WINDOWS的问题,是你没做好互斥的问题,多线程要很小心,很容易死锁的。
    把所有的信号量都等齐--这是很危险的,最好WaitForSingleObject设置超时限制
      

  2.   

    huang_yu(HY):事实上,我通过写日志文件发现
    case IO_ERROR:
    里面的代码根本没执行到,一次都没执行过,,,过了一段时间,同样会出现死锁问题。这就排除了是因为等齐所有信号量的问题。在线程里函数里去掉所有的WaitForSingleObject和ReleaseSemaphore语句后,就一切正常,不会死锁。