【问题标题】:Winsock blocking sockets, multithreading deadlockWinsock阻塞套接字,多线程死锁
【发布时间】:2011-03-18 20:05:00
【问题描述】:

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

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 是在循环中执行发送/接收的独立线程。这些套接字是阻塞的、BSD 风格的 TCP 套接字。

当我更改操作顺序以在接收器之前启动发送器时,它可以工作。

为什么?

【问题讨论】:

标签: sockets tcp network-programming winsock


【解决方案1】:

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

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

通常在客户端和服务器端都引入详细日志记录来调试此类问题。当问题发生时,您可以分析日志并查看问题所在。

【讨论】:

  • 在我的示例中,两端都有一个发送和一个接收线程。两者都发送和接收连续的非结构化数据,它们根本不解析。在此设置中,Imo 不会发生死锁,在 Unix 系统上也不会发生死锁。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-04
  • 2013-03-31
相关资源
最近更新 更多