我用这个复制器找到了我的一些代码中的死锁:

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中出现死锁。发送方和接收方是在循环中执行send/recv的独立线程。这些套接字是阻塞的、BSD样式的TCP套接字。
当我更改操作顺序以在接收者之前启动发送者时,它会工作。
为什么?

最佳答案

在您的示例中,如果peer1不读取数据,则peer2将在套接字发送缓冲区已满后阻止发送。
通常,如果您有某种协议,并且服务器在客户机等待响应时无法读取消息部分,就会发生死锁。
一般来说,为了调试这类问题,详细的日志记录在客户端和服务器端都会被引入。当问题发生时,您可以分析日志并查看出了什么问题。

关于sockets - Winsock阻塞套接字,多线程死锁,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3296920/

10-14 22:58
查看更多