这是我的一个程序
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下好像有点问题,,是这样的吗?
各位有没有遇到这种情况?
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下好像有点问题,,是这样的吗?
各位有没有遇到这种情况?
解决方案 »
- 对话框
- 忘记了一个统一“messagebox弹出时的标题”函数了
- vc6.0中可以判断出当前系统是xp x64还是server 2003 x64吗?
- 100分求如何做一下有视频语音、且能看到桌面操作的教学软件?
- 按网页做的程序为何有问题。HELP~~
- Visual C++ 的小小问题
- 我用_outp()对并口写进一个字符,再用_inp()读并口。但因为_inp()返回值为整型,在Edit Box中显示的是十进制的数字,怎样才能使它显示原
- 请教高手Dll调用的问题!!!
- 提问
- 求在ADO中调用ORACLE存储过程,返回结果集的demo例子
- 属性页中怎么设置其中一个page为disable,就是不能点击
- 如何实现数据库的导入和导出?
把所有的信号量都等齐--这是很危险的,最好WaitForSingleObject设置超时限制
case IO_ERROR:
里面的代码根本没执行到,一次都没执行过,,,过了一段时间,同样会出现死锁问题。这就排除了是因为等齐所有信号量的问题。在线程里函数里去掉所有的WaitForSingleObject和ReleaseSemaphore语句后,就一切正常,不会死锁。