problemas de procesamiento temporizador servidor Linux a tener en cuenta

  
 

Esta mañana, el servidor de inspecciones de rutina, utilizo comando strace rastrea el proceso del servidor, me encontré con unos procesos de servidor aparecieron en una situación de bloqueo, el BGF continuar el seguimiento, la demostración de la siguiente manera:
gdb) bt # 0 0x00ff9410 en __kernel_vsyscall () # 1 0x004d593e en __lll_mutex_lock_wait () desde /lib/libc.so.6#2 0x00465b38 en _L_lock_14080 () desde /lib/libc.so.6#3 0x00464df4 en free () de /lib/libc.so .6 # 4 0x006c7691 en el operador delete () desde /usr/lib/libstdc++.so.6#5 0x08059cfb en __gnu_cxx :: new_allocator < st. T. ) en /usr/lib/gcc/i386-redhat-linux/4.1.1/../../../../include/c++/4.1.1/ext/new_allocator.h:94#6 0x08059d20 en std :: _ List_base < TTimeEvent, std :: asignador < TTimeEvent > > :: _ M_put_node (esto = 0x98e0064, __p = 0x98e1218) en /usr/lib/gcc/i386-redhat-linux/4.1.1/../. ./../../include/c++/4.1.1/bits/stl_list.h:320#7 0x08059d81 en std :: lista < TTimeEvent, std :: asignador < TTimeEvent > > :: _ M_erase (esto = 0x98e0064 , __position = {_ M _node = 0x98e1218}) en /usr/lib/gcc/i386-redhat-linux/4.1.1/../../../../include/c++/4.1.1/bits/stl_list.h:1150 # 8 0x08059db3 en std :: lista < TTimeEvent, std :: asignador < TTimeEvent > > :: pop_front (esto = 0x98e0064) en /usr/lib/gcc/i386-redhat-linux/4.1.1/../. ./../../include/c++/4.1.1/bits/stl_list.h:747#9 0x08059334 en CTimerManager :: Process (esto = 0x98e0058) en src /timermanager.cpp: 168 # 10 0x080597dd en el Proceso ( nSigNo = 14) en src /timermanager.cpp: 199 # 11 < controlador de señal llamada > # 12 0x004612ba en _int_free () desde /lib/libc.so.6#13 0x00464e00 en free () de /lib/libc.so 0.6 # 14 en 0x006c7691 operador delete () desde /usr/lib/libstdc++.so.6#15 0x006a424d en std :: string :: _ :: _ Rep M_destroy () desde /usr/lib/libstdc++.so.6#16 0x0069e40f en std :: basic_stringbuf < char, std :: char_traits < Char >, std :: asignador < Char > > :: ~ basic_stringbuf () desde /usr/lib/libstdc++.so.6#17 0x0069fd7f en std :: basic_stringstream < char, std :: char_traits < Char >, std :: asignador < Char > > :: ~ basic_stringstream () desde /usr/lib/libstdc++.so.6#18 0x080524ea en CDBMoudle :: Insert (este = tFixkey = @ 0xbfe1c6ec 0x98e6e80,) en src /dbmoudle.cpp: 59 # 19 0x08051718 en CConnectionTask :: ProcFixContent (esto = 0x98e6510) en src /connectiontask.cpp: 218 # 20 0x0805196e en CConnectionTask :: HandleRead (esto = 0x98e6510) en src /connectiontask.cpp: 86 # 21 0x08051a0f en CConnectionTask :: Handle (esto = 0x98e6510, nEvent = 1) a src /connectiontask.cpp: 52 # 22 0x080585af en IServer :: Run (este = 0xbfe1c7e0) en src /server.cpp: 133 # 23 0x08055328 en main (argc = 2, argv = 0xbfe1c8b4) en src /main.cpp: 19

en el # 13, llamada gratuita, a continuación, en las llamadas a funciones libc asociados a ella. sin embargo, el módulo de gestión de temporizador se interrumpe antes del final de esta llamada no ha entrado en una parte de procesamiento de temporizador, en este el mismo proceso se denomina función libre, por lo que hay una situación de bloqueo - debido a malloc /libre de la familia de funciones no es reentrante, donde hay un artículo relacionado que he probado en mi código de servidor para minimizar el objeto constructor /destructor, sino que quiere Mira, esta estrategia es no soluciones radicales, lo que significa que tengo que estar siempre cuidado al escribir código, puede aparecer hoy en un interbloqueo puede ocurrir en B mañana. Además, dado que el uso de C ++, algunos de los objetos locales . el constructor y el destructor es inevitable entonces, las ideas para resolver este problema se cambia a: simplificar lo más posible cuando una estrategia de operación de procesamiento de temporizador en la actualidad creo que, cuando se activa un temporizador, establece un indicador. en cambio llama cuando el correspondiente controlador de disparo, y luego determinar si el ciclo se encuentra en el servidor principal, y si el tratamiento de llamadas de modo relevante, de nuevo, la idea original es :.
//esta función cuando se activa el temporizador cuando la señal de vacío () {//temporizador controlador de dosomething ();} while (1) {bucle principal del servidor;}

idea después de las modificaciones son:
int violar g_alarm = 0; //esta función cuando se activa el temporizador cuando la señal de vacío () {g_alarm = 1;} while (1) {bucle principal servidor; si (g_alarm) {//manejador temporizador doSomething ( ); g_alarm = 0;}}

esta es probablemente El mencionado tipo de cambio. Esta es la mejor manera de abordar esta cuestión se me ocurre en la actualidad, si que es una mejor manera de dar la bienvenida suplemento.

Copyright © Conocimiento de Windows All Rights Reserved