2009-09-21 9 views
5

esto está un poco relacionado con this question.Bloquear a través de varios jvm?

Estoy usando make para extraer algo de información sobre algunos programas C. Estoy envolviendo la compilación usando un script bash que ejecuta mi programa java y luego gcc. Básicamente, estoy haciendo:

make CC=~/my_script.sh 

Me gustaría utilizar varios trabajos (opción -j con make). Está ejecutando varios procesos de acuerdo con las reglas de dependencia.

Si lo entendiera bien, tendría tantas instancias de jvm como trabajos, ¿verdad?

Lo que pasa es que estoy usando sqlite-jdb para recopilar información. Entonces, ¿el problema es cómo evitar varios procesos tratando de modificar el DB al mismo tiempo? Parece que el bloqueo sqlite es jvm-dependent (es decir, un bloqueo puede ser "ver" solo dentro del jvm de bloqueo), y que esto es lo mismo para RandomAccessFile.lock().

¿Tiene alguna idea de cómo hacerlo? (Creación de un archivo tmp y luego mirando si existe o no parece ser una posibilidad, pero puede ser costoso. Una tabla de bloqueo en el PP?)

gracias

Respuesta

9

java.nio.channels.FileLock permite el bloqueo de archivos de procesos cruzados a nivel del sistema operativo.

Sin embargo, usar make para iniciar un scripts bash que ejecute varias JVM en paralelo antes de llamar a gcc suena demasiado Rube-Goldbergian y frágil para mí.

+0

Me encanta la referencia ... para mí también, es demasiado frágil. Pero tengo que capturar todos los parámetros dados a gcc, y el sistema creado es bastante complejo (y el sistema de construcción también), no tenía muchas opciones. – LB40

4

hay varias soluciones para esto. si su bloqueo debe estar dentro de la misma máquina, puede usar un socket de servidor para implementarlo (El proceso que logra vincularse primero al puerto posee el bloqueo, otros procesos esperan a que el puerto esté disponible).

si necesita un bloqueo que abarque varias máquinas puede utilizar un bloqueo de memcached. esto requerirá la ejecución de un servidor memcached. Puedo pegar un código si está interesado en esta solución.

puede obtener la biblioteca de Java para conectarse a memcached here.

+0

solo un puntero para el servidor de memcached debería estar bien, gracias. – LB40

+0

actualizó la respuesta para incluir enlaces memcached y memcached java lib. –

1

Puede probar Terracotta para compartir objetos entre varias instancias de JVM. Puede parecer una solución demasiado pesada para sus necesidades, pero al menos vale la pena considerarla.

Cuestiones relacionadas