Многопоточность, розетки - PullRequest
1 голос
/ 16 августа 2011

У меня есть класс для написания инструкций для WinSock.В моей программе более одной темы.Я использую для синхронизации объектов (пример std :: queue) с критическими секциями.Но у меня есть ошибки в классе сокетов:

iResult = getaddrinfo(host.c_str(), port.c_str(), &hints, &(*this).addrresult); //permision error

В однопоточном режиме все в порядке.Но если я запускаю более одного потока, программа имеет ошибку.Помоги мне.

int jSocket::ConnectSock(const std::string host, const std::string port)
{
    int iResult;
    struct addrinfo hints, *ptr;

    ZeroMemory(&hints, sizeof(hints));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;

    iResult = getaddrinfo(host.c_str(), port.c_str(), &hints, &(*this).addrresult);
    if (iResult != 0)
    {
        WSACleanup();
        return -1;
    }

    ptr = (*this).addrresult;
    (*this).sock = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol);

    if ((*this).sock == INVALID_SOCKET)
    {
        freeaddrinfo(addrresult);
        WSACleanup();
        return -1;
    }

    iResult = connect((*this).sock, ptr->ai_addr, (int)ptr->ai_addrlen);
    if (iResult == SOCKET_ERROR)
    {
        closesocket((*this).sock);
        return -1;
    }

    return 0;
}

Извините за мой английский.

1 Ответ

0 голосов
/ 16 августа 2011

Похоже на гонку на addrresult указателе члена.Вы опубликовали метод без повторного входа , поскольку он обновляет переменные-члены.Если вы вызываете его одновременно из нескольких потоков, вы получаете сюрпризы.Я предполагаю, что в данном конкретном случае addrresult может быть выделено в одном потоке, а затем перезаписано в другом.Вы можете получить утечку памяти и получить доступ к памяти free.

...