使用完成端口的时候 为什么我的mutex要报错?

本人使用完成端口时 由于使用了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重叠对象
                //......

我断点查看了一下

img


还未执行这一句时所有权是有的 但是一执行所有权就没了 且报错

img

img

本人查了很多资料 还是不知道是什么引起的 是完成端口的原因 还是处理内存出错 请各位指点指点

没用过Windows的mutex,但看样子像内存出错了,把锁给踩了。