【发布时间】: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 套接字。
当我更改操作顺序以在接收器之前启动发送器时,它可以工作。
为什么?
【问题讨论】:
-
我认为没有足够的代码知道。
-
或者,您可以将equalizergraphics.com/downloads/3296920/sync.diff 应用到equalizer.svn.sourceforge.net/svnroot/equalizer/branches/… 的svn repo,在VS2005 中构建解决方案并运行netperf 可执行文件。
标签: sockets tcp network-programming winsock