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:
à 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
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); }
Est-il possible que dans ces conditions la librairie ne soit pas thread safe ?
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 ?? ()
é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![]()
Partager