本帖最后由 q860880076 于 2011-01-19 12:50:49 编辑

解决方案 »

  1.   

    是不是你的GetQueuedCompletionStatus的第一个参数IOCP的句柄不对了?
      

  2.   

    不是所有线程里的 GetQueuedCompletionStatus 都失败 .  几个线程里的 hIoCompletionPort  都是一样的...
      

  3.   

    你传递给线程的参数hServer不会是个局部变量吧?
      

  4.   


    不是 ,  是 HeapAlloc 分配的内存
      

  5.   

    每个 hServer 都有一个 Heap  HeapCreate   然后在其中分配内存 收发缓冲区都是在这个 Heap 中分配的
      

  6.   

    是这样创建线程的
    //
    // 创建 hServer 并为其赋值
    // 2011/01/17 HSERVER hServer = (HSERVER)HeapAlloc(
    hHeap,
    HEAP_ZERO_MEMORY,
    sizeof(SERVER));
    if (!hServer)
    { // HeapAlloc 失败
    HeapDestroy(hHeap);
    closesocket(ListenSocket);
    CloseHandle(hIoCompletionPort);
    return NULL;
    }
    hServer->hHeap = hHeap;
    hServer->ListenSocket = ListenSocket;
    hServer->hIoCompletionPort = hIoCompletionPort;
    hServer->ITS_CallBack = CallBack;
    hServer->WTC = SysInf.dwNumberOfProcessors * 2;
    hServer->Handle_table = Handle_table;
    hServer->hThread_accept = 0; //
    // 创建工作者线程 并将线程句柄 赋值到 Handle_table
    // 2011/01/17
    HANDLE hThread;
    int j = 0;
    for (DWORD i=0;i<(SysInf.dwNumberOfProcessors * 2);i++)
    {
    hThread = CreateThread(
    NULL,
    0,
    WorkerThread,
    hServer,
    0,
    NULL);
    if (hThread)
    {
    j++;
    *(PDWORD)(Handle_table + i * 4) = (DWORD)hThread;
    }
    }
    if (!j)
    { // 0个线程被创建
    HeapDestroy(hHeap);
    closesocket(ListenSocket);
    CloseHandle(hIoCompletionPort);
    return NULL;
    }
      

  7.   

    终于找到原因了....  Handle_table 是 PDWORD
    *(PDWORD)(Handle_table + i * 4) = (DWORD)hThread;   错误的 , 导致 hServer 遭到破坏...
    *(PHANDLE)(Handle_table + i) = hThread;   应该是这样的
    或者
    *(PHANDLE)((DWORD)Handle_table + i * 4) = hThread;