2010-07-21 14 views
1

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?

+0

Je ne pense pas qu'il y ait assez de code pour savoir. –

+0

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

+0

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

Répondre

0

Dans votre exemple, si Peer1 ne lit pas les données d'un Hôte2 bloquera en envoyer après le tampon d'envoi du socket est pleine.

Habituellement interblocage peut se produire si vous avez une sorte de protocole et le serveur ne parvient pas à lire une partie du message pendant que le client attend une réponse.

Généralement pour déboguer ce genre de problèmes de journalisation détaillée est introduit à la fois sur les côtés client et serveur. Et lorsque le problème survient, vous pouvez analyser les journaux et voir ce qui n'a pas fonctionné.

+0

Dans mes exemples, les deux extrémités ont un thread d'envoi et de recv. Les deux envoient et reçoivent des données en continu non structurées, qu'ils n'analysent pas du tout. Imo aucun blocage ne doit se produire dans cette configuration, et aucun sur les systèmes Unix. – eile