visual studio punto proceso modo interrupción interrupcion hay encuentra desencadenado depurar depurador debuggear como asociar asociado aplicacion adjuntar actualmente activará c++ concurrency synchronization mutex nas

c++ - studio - ¿Cómo puedo sincronizar dos procesos que acceden a un archivo en un NAS?



visual studio adjuntar (5)

¿Sería posible cambiar de un archivo a una base de datos?

Este tipo de concurencia es algo que los DBMSs manejan muy bien. No necesita ser costoso o difícil de instalar. MySql, Postgress o JavaDB manejarían todo esto elegantemente a bajo costo o sin costo alguno.

A falta de la opción de base de datos, el proceso de escritura escribiría en un nombre de archivo "oculto" como ".updateinprogress.xml" y cambiaría el nombre del archivo cuando se completara la actualización. En la mayoría de los sistemas, "mv" o "ren" es una operación atómica, por lo que el proceso de lectura o recoge el archivo anterior o el archivo más nuevo, pero nunca medio escrito.

Aquí está el problema: tengo dos aplicaciones, escritas en C ++ y que se ejecutan en dos máquinas con sistema operativo diferente (una Linux y una Windows). Uno de estos procesos es el encargado de actualizar un archivo XML en un NAS (Network Attached Storage) mientras que el otro lee este archivo.

¿Es posible sincronizar estos dos procesos para evitar la lectura del archivo al mismo tiempo que se está modificando?


OK, necesitas algún tipo de mecanismo de bloqueo para controlar accesos.

La mayoría de los sistemas de archivos * nix proporcionan esto. Sospecho que también está disponible en Windows File System (ya que Perl usa este mecanismo) pero puede tener otro nombre.

Echa un vistazo a la bandada ().
Este es un mecanismo de bloqueo de archivos. Es un bloqueo de aviso por lo que no bloquea el archivo y evita el uso, pero proporciona un mecanismo para marcar el archivo. Si ambas aplicaciones usan el mecanismo, entonces puedes controlar los accesos al archivo.

flock () proporciona tanto bloqueos compartidos (o READ Lock) como bloqueos exclusivos (o WRITE Lock). flock bloqueará su hilo (de forma no ocupada) hasta que el usuario haya desbloqueado el archivo (también proporciona controles NO bloqueantes para que pueda hacer otras cosas mientras espera).

Verifique el rebaño en la sección 2 de las páginas man.

int flock(int fd, int operation); Flock() applies or removes an advisory lock on the file associated with the file descriptor fd. A lock is applied by specifying an operation parameter that is one of LOCK_SH or LOCK_EX with the optional addition of LOCK_NB. To unlock an existing lock operation should be LOCK_UN.


Puede crear un archivo de bloqueo en el servidor que se crea antes de escribir, esperar y luego escribir y eliminar al finalizar. Haga que el proceso de lectura compruebe el token antes de leer el archivo.

Editar : para abordar los comentarios, puede implementar un patrón de tipo de bloqueo con doble verificación. Haga que tanto el lector como el escritor tengan un archivo de bloqueo y comprueben dos veces antes de trabajar, algo como:

Lector: verifique el archivo de bloqueo de escritura, cree un archivo de bloqueo de lectura, compruebe si hay archivo de bloqueo de escritura, si existe, borre el archivo de lectura y cancele.

Escritor: compruebe si hay un archivo de bloqueo de lectura, cree un archivo de bloqueo de escritura, compruebe si hay un archivo de bloqueo de lectura, si existe, elimine el archivo de bloqueo de escritura y cancele.

Esto evitará que sus procesos se pisen entre sí, pero puede ocurrir una posible condición de carrera en la que potencialmente podría tener ambos procesos controlados, crear y volver a verificar simultáneamente, aunque esto no hará que los datos se lean en un estado incoherente, sino que ambos leerán y escribir procesos para abortar por la demora especificada


Si los archivos residen en un recurso compartido de NFS, puede usar fcntl (2) para bloquear el archivo. Consulte la pregunta D10 en las preguntas frecuentes de Linux NFS . Tengo muy poca experiencia con las API de Windows, pero por lo que he oído, tienen un buen soporte POSIX, por lo que debería poder usar fcntl siempre que admitan POSIX.1-2001.

Si está accediendo a los archivos utilizando diferentes protocolos (es decir, AFS o SMB), ¿podría configurar un servidor de sincronización simple que administre bloqueos a través de una interfaz IPC?


Gracias a todos por sus respuestas o comentarios.

Por fin logramos resolver nuestro problema, no mediante el uso de comandos de bloqueo del sistema operativo (porque no estábamos seguros de si se propagarían correctamente al sistema operativo del cabezal NAS), sino creando directorios de bloqueo en lugar de archivos de bloqueo. La creación de directorio es una operación atómica y devuelve un valor de error si la carpeta ya existe. Por lo tanto, no es necesario verificar la existencia de bloqueo antes de adquirirlo, ambas operaciones se realizan en un solo paso.