j'ai traqué une impasse dans un code de mes utilisant ce reproducer:prises de blocage Winsock, blocage de multithreading
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();
}
Je commence sur la même machine un serveur et un processus client sur 127.0.0.1:1234 . Les deux deadlock immédiatement dans :: recv et :: envoyer. Sender et Receiver sont des threads séparés exécutant send/recv dans une boucle. Les sockets bloquent, les sockets TCP de style BSD.
Quand je change l'ordre des opérations pour démarrer l'expéditeur avant les récepteurs, cela fonctionne.
Pourquoi?
Je ne pense pas qu'il y ait assez de code pour savoir. –
Les détails sont ici: http://www.equalizergraphics.com/downloads/3296920/netperf.cpp http://www.equalizergraphics.com/downloads/3296920/socketConnection.cpp http: // www. equalizergraphics.com/downloads/3296920/socketConnection.h http://www.equalizergraphics.com/downloads/3296920/init.cpp – eile
vous pouvez également appliquer http://www.equalizergraphics.com/downloads/3296920/sync. diff à svn repo à https://equalizer.svn.sourceforge.net/svnroot/equalizer/branches/0.9.1-work, compilez la solution dans VS2005 et exécutez l'exécutable netperf. – eile