本人使用完成端口时 由于使用了map去管理连接的socket 因此必须上锁
但是在运行的过程中 只要有客户端退出 服务端马上就会报错
本人的代码如下
unsigned int __stdcall IOCP::GetSocketThreadProc(PVOID pMP)
{
MainProgram* mainProgram = (MainProgram*)pMP;
DWORD NumberOfBytes;
ULONG_PTR index;
OVERLAPPED* pOverlapped;
while (mainProgram->g_iocp->m_flag)
{
///main-------------------------------------------------------------------------------------------------------------
BOOL bFlag = GetQueuedCompletionStatus(mainProgram->g_iocp->m_hPortBind, &NumberOfBytes, &index, &pOverlapped, INFINITE);
if (false == bFlag)
{
/*std::unique_lock<std::mutex> lck(mainProgram->g_iocp->m_mapOLPLock);*/
//if (lck.owns_lock() == 0)return 0;
int error = GetLastError();
cout << "线程队列获取失败,错误码:" << error << endl;
if (error == 64)
{
cout << "强制退出" << endl;
std::unique_lock<std::mutex> lck(mainProgram->g_iocp->m_mapOLPLock);
closesocket(index);
WSACloseEvent(mainProgram->g_iocp->m_mapOLP[index].hEvent);
//从数组中删掉
mainProgram->g_iocp->m_mapOLP.erase(index);//删除IO重叠对象
//......
我断点查看了一下
本人查了很多资料 还是不知道是什么引起的 是完成端口的原因 还是处理内存出错 请各位指点指点
没用过Windows的mutex,但看样子像内存出错了,把锁给踩了。