Я обнаружил тупик в моем коде, используя этот репродуктор:
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.
Когда я изменяю порядок операций для запуска Отправителя перед Получателями, он работает.
Почему?