IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Boost C++ Discussion :

boost::asio::ip::tcp::socket est elle thread safe ?


Sujet :

Boost C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 28
    Points : 16
    Points
    16
    Par défaut boost::asio::ip::tcp::socket est elle thread safe ?
    bonjour, je voudrai ouvrir une connexion tcp depuis 2 threads differents, je vous poste une version simplifiée qui genere le segmentation fault ou un illegal instruction(SIGILL), c'est selon l'humeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    unsigned short port = 6666;
    char ipchar[200]= "127.0.0.1";
     
     
    static void GLFWCALL launchThread1 (void * p) {
    	try {
    		boost::asio::io_service myIO;
     
    		boost::asio::ip::tcp::endpoint iaServer (boost::asio::ip::address::from_string(ipchar), port);
    		boost::asio::ip::tcp::socket clientSocket(myIO);
    		clientSocket.connect(iaServer); // c'est ici que ca plante
    	}
    	catch (std::exception& e) {
    		fprintf (stdout, "*********after connect1:%s\n", e.what());fflush(stdout);
    	}
    	catch (...) {
    		fprintf (stdout, "*********after connect2\n");fflush(stdout);
    	}
    	fprintf (stdout, "th1----\n");fflush(stdout);
    }
     
    int main () {
    	GLFWthread th1, th2;
    	glfwInit();
    	th1 = glfwCreateThread (launchThread1,NULL);
    	th2 = glfwCreateThread (launchThread1,NULL);
     
    	fprintf (stdout, "m1----\n");fflush(stdout);
    	glfwWaitThread (th1, GLFW_WAIT);
    	glfwWaitThread (th2, GLFW_WAIT);
    	fprintf (stdout, "mend----\n");fflush(stdout);
    }
    à l'execution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    Program received signal SIGSEGV, Segmentation fault.
    [Switching to thread 3468.0x5b8]
    0x015afedc in ?? ()
    (gdb) bt
    #0  0x015afedc in ?? ()
    #1  0x00410fec in _Unwind_SjLj_RaiseException ()
        at C:/Dev/boost/boost/asio/detail/call_stack.hpp:84
    #2  0x0040804d in __cxa_throw ()
        at C:/Dev/boost/boost/asio/detail/call_stack.hpp:84
    #3  0x0041a106 in boost::throw_exception<boost::system::system_error> (
        e=@0x17afd2c) at C:/Dev/boost/boost/throw_exception.hpp:64
    #4  0x0041bfe0 in boost::asio::detail::throw_error (err=@0x17afd8c)
        at C:/Dev/boost/boost/asio/detail/throw_error.hpp:36
    #5  0x0041abae in boost::asio::basic_socket<boost::asio::ip::tcp, boost::asio::s
    tream_socket_service<boost::asio::ip::tcp> >::connect (this=0x17afe0c,
        peer_endpoint=@0x17afedc) at C:/Dev/boost/boost/asio/basic_socket.hpp:556
    #6  0x0040150d in launchThread1 (p=0x3e2718) at testlexical.cpp:49
    #7  0x00402568 in _glfwNewThread@4 ()
        at C:/Dev/boost/boost/asio/detail/call_stack.hpp:84
    #8  0x7c80b729 in KERNEL32!GetModuleFileNameA ()
       from C:\WINDOWS\system32\kernel32.dll
    #9  0x00000000 in ?? ()
    Est-il possible que dans ces conditions la librairie ne soit pas thread safe ?

    édit: testé sur un serveur qui répond, l'exception n'est pas levée, pas de segmentation

    testé sur boost 1_41 et 1_42, gcc(mingw)3.4.5, et testé avec les boost::thread

    les options de linkage:
    -llibboost_thread-mgw34-mt-d-1_42 -llibboost_system-mgw34-mt-d-1_42

    J'arrête pour aujourd'hui, ou je vais me tirer une balle dans la tête.
    A l'aide

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Points : 219
    Points
    219
    Par défaut
    Salut,

    Essaie avec l'option -mthreads (un 'man gcc' t'en dira plus)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 28
    Points : 16
    Points
    16
    Par défaut

    Merci Montag, grace à toi j'arriverai peut à franchir cet obstacle, nan que dis-je, ce mont, cette Montague

    Un grand merci, si tu savais comment j'ai galéré. Je m'étais uniquement focalisé sur boost.

    Est-ce une bonne idée d'utiliser cette option systématiquement ?

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Points : 219
    Points
    219
    Par défaut
    Citation Envoyé par nemodev Voir le message

    Merci Montag, grace à toi j'arriverai peut à franchir cet obstacle, nan que dis-je, ce mont, cette Montague

    Un grand merci, si tu savais comment j'ai galéré. Je m'étais uniquement focalisé sur boost.
    De rien J'ai aussi été confronté à ce problème et j'avais moi aussi galéré pour trouver la réponse.

    Citation Envoyé par nemodev Voir le message
    Est-ce une bonne idée d'utiliser cette option systématiquement ?
    Cette option n'est à utiliser que quand tu utilises MinGW et que tu sais que des exceptions peuvent être levées dans des threads.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    ok, merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Un constructeur est-il thread-safe ?
    Par Chatanga dans le forum Concurrence et multi-thread
    Réponses: 10
    Dernier message: 25/04/2012, 14h56
  2. Réponses: 12
    Dernier message: 22/02/2009, 16h31
  3. Réponses: 11
    Dernier message: 24/09/2008, 14h22
  4. socket ssl & boost::asio
    Par kass28 dans le forum Boost
    Réponses: 0
    Dernier message: 16/10/2007, 09h38
  5. Boost::asio : multi threading ou pas?
    Par Alp dans le forum Boost
    Réponses: 9
    Dernier message: 02/09/2006, 22h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo