C ++线程/矢量聊天

时间:2012-01-11 18:50:10

标签: c++ multithreading debugging

好的我正在做的如下,我启动一个构造函数,其中Socket正在为服务器进行侦听。 (绑定,倾听等) 然后我将生成一个Thread来启动一个函数来查找客户端的来电,他必须接受这些来电。 在接受后,必须将连接的Socket放在列表中。 之后,正在制作一个新线程。

但他坚持接受客户,我真的很关注它。 希望不要多问。

First-chance exception at 0x010820b1 in ChatServer.exe: 0xC0000005: Access violation reading location 0x00000000. Unhandled exception at 0x010820b1 in ChatServer.exe: 0xC0000005: Access violation reading location 0x00000000.

有点多 - > ServerCode:

int main(int argc, char* argv[])
{

//Constructor that takes care of making connection

//Throw in a new Thread

CreateThread(0,0,&ServerListenThread,0,0,0);

//while loop to get input and pass it to the SendMessages function

//function being called within a Thread

DWORD WINAPI ServerListenThread(LPVOID pParam)
{   
    while(1)

        CServerObj->StartListenClient();
    return 0;
}

void CServer::StartListenClient()
{

    sockaddr_in i_addr;
    int i_addrlen = sizeof(i_addr);
    SocketC = accept(SocketS,(struct sockaddr*)&i_addr,&i_addrlen);  <<<Here it gives the Access Violation< at the accept
    {
            cout << "A Connection was found with :" <<endl;
    }

    SocketS = SocketC;

    if(SocketS != INVALID_SOCKET)
    {
        vClientList.push_back(SocketS);
        CreateThread(0,0,&ServerRecThread, (void*)SocketS, 0,0);
    }
}

1 个答案:

答案 0 :(得分:1)

您最有可能遇到尝试通过陈旧迭代器访问向量中的值的情况。由于您正在使用线程,因此可能有一个场景,其中一个线程正在向向量添加,这导致重新分配向量的内容。因此,如果另一个线程同时迭代向量,它的迭代器将在重新分配原始向量的内容后失效,并且您将遇到您遇到的错误,迭代器指向的内容不是在矢量中。

如果您的vClientVector在线程之间共享,并且在其他线程正在读取它时有一个线程写入它,那么它应该使用互斥体保护,可能是读取器/写入器类型,以便允许多个读者,但一次只有一个作家。