Winsock阻塞套接字,多线程死锁

时间:2010-07-21 06:58:19

标签: sockets tcp network-programming winsock

我使用这个复制器跟踪了我的一些代码中的死锁:

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中立即死锁。 Sender和Receiver是在循环中执行send / recv的独立线程。套接字是阻塞的,BSD风格的TCP套接字。

当我在接收者之前更改操作顺序以启动发件人时,它可以正常工作。

为什么?

1 个答案:

答案 0 :(得分:0)

在你的例子中,如果peer1没有读取数据,则在套接字发送缓冲区已满后,peer2将在发送中阻塞。

如果您有某种协议且服务器在客户端等待响应时无法读取消息部分,通常会发生死锁。

一般来说,要调试这种问题,请在客户端和服务器端引入详细日志记录。当问题发生时,您可以分析日志并查看出现了什么问题。