Блокировка розеток Winsock, многопоточный тупик - PullRequest
1 голос
/ 21 июля 2010

Я обнаружил тупик в моем коде, используя этот репродуктор:

if( isClient )
{
    Sender sender;
    Receiver receiver;
    ConnectionPtr connection = Connection::create( description );
    TEST( connection->connect( ));

    receiver.start();
    Sleep( 100 );
    sender.start();

    sender.join();
}
else
{
    ConnectionPtr connection = Connection::create( description );
    TEST( connection->listen( ));

    Sender sender;
    Receiver receiver;
    ConnectionPtr reader = connection->accept();

    receiver.start();
    Sleep( 100 );
    sender.start();

    receiver.join();
}

На той же машине я запускаю сервер, а затем клиентский процесс на 127.0.0.1:1234. Оба тупика сразу в :: recv и :: send. Отправитель и Получатель являются отдельными потоками, выполняющими отправку / запись в цикле Розетки блокирующие, розетки TCP в стиле BSD.

Когда я изменяю порядок операций для запуска Отправителя перед Получателями, он работает.

Почему?

1 Ответ

0 голосов
/ 21 июля 2010

В вашем примере, если peer1 не читает данные, peer2 блокирует отправку после заполнения буфера отправки сокета.

Обычно может возникнуть взаимоблокировка, если у вас есть какой-то протокол и сервер не может прочитать часть сообщенияв то время как клиент ожидает ответа.

Как правило, для устранения проблем такого рода вводится подробное ведение журнала как на стороне клиента, так и на стороне сервера.И когда возникает проблема, вы можете проанализировать журналы и посмотреть, что пошло не так.

...