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.
Descarga NetBeans Toma netbeans-7.0beta2-ml-javaee-linux.sh como ejemplo #sh netbeans-7.0beta2
no puede escribir datos en el disco duro de un sistema Linux o UNIX? Para resolve
Cómo realizar eficazmente la administración de parches de Linux Red Hat Linux OS El parche de
partición del disco en Linux, formateo del sistema de archivos y dispositivo raid - comparando el fo
Cómo migrar información de cuenta entre servidores Linux
Sistema operativo Linux programa de fondo de cambio de fondo
Redhat /Centos NIC enlace tutorial básico
Administración y mantenimiento del sistema Linux - comando scp
Es posible que no sepa que la comunicación entre procesos del sistema operativo Linux
Aprendizaje completo del script de shell de Linux
Tutorial básico de configuración de crontab tarea bajo Linux
La función CTRL + Z cuando se ejecutan comandos en el sistema operativo Linux
Tutorial Web: Implementando Filtrado de Internet bajo Linux
Búsqueda de comando de búsqueda de archivos de Linux, xargs detallados
WinXP Eliminar una red inalámbrica y su contraseña almacenada en el equipo Método
Enseñe cómo hacer un fondo de escritorio de Win7
Cómo agrega Windows 8 la ubicación de la red en el Explorador
Cómo RealPlayer Player establece la mejor reproducción de video
Win10 cómo configurar la entrada de arranque Win10 prohíbe el método de arranque
¿Cómo lidiar con el sistema Windows 8 no puedo abrir la aplicación Metro?
¿Qué debo hacer si mi sistema Win8 se convierte en un entorno de Windows To Go?
Win8 determina cómo el tipo de inicio del sistema es UEFI o BIOS