Estoy escribiendo el código en C++. ¿Puedo encontrarme en cualquier tipo de condiciones de carrera o seg-faults?¿Pueden varios subprocesos escribir en un archivo simultáneamente, si todos los subprocesos están escribiendo en diferentes ubicaciones?
Respuesta
No hay problema para hacerlo desde el punto de vista del sistema subyacente (para todos los sistemas que conozco). Sin embargo, normalmente necesitaría tener descriptores/manejadores de archivos completamente separados. Esto se debe a que el descriptor de archivo mantiene el estado, p. la posición actual del archivo
También debe comprobar la seguridad de subprocesos de la interfaz particular de C++ en el sistema de archivos que está utilizando. Esto es necesario además de la seguridad de subprocesos del sistema de archivos subyacente.
También debe considerar la posibilidad de que las E/S con rosca sean más lentas. El sistema puede tener que serializar el acceso al bus. Puede obtener un mejor rendimiento de E/S superpuestas o una secuencia de E/S dedicada alimentada a través de una canalización de productor/consumidor.
En cada uno de los hilos, estoy abriendo el mismo archivo y luego escribiendo en el archivo de acuerdo con la posición que es diferente para cada hilo. Entonces, ¿puedo seguir adelante e implementar correctamente? – Invictus
No podría decirlo con certeza. No has mostrado tu código. Pero mientras tengas diferentes mangos, deberías estar bien. –
Claro que puedes. La condición de carrera puede ocurrir dependiendo de cómo está escribiendo el código real (es decir, usando ese archivo). Además, si IO está almacenado en búfer, pueden aparecer cosas extrañas si las regiones almacenadas se superponen.
Depende. Los archivos no son sus identificadores y las transmisiones no son archivos. Este tres concepto diferente debe ser claro.
Ahora, el sistema operativo puede abrir el archivo varias veces devolviendo diferentes identificadores, cada uno de los cuales tiene su propio "puntero de posición". Si el archivo se abre en "modo compartir" tanto para leer como para escribir, puede buscar los controles donde desee y leer/escribir a su gusto. El hecho de que no sobrescriba depende de usted. El sistema otorga la secuencia de las operaciones para todo el archivo o parte de él (pero se requiere más información sobre el sistema operativo)
Si cada identificador está conectado a un flujo diferente, cada flujo escribirá independientemente del otro. Pero -en este caso- existe la complicación del "almacenamiento en búfer" (la escritura se puede retrasar y la lectura puede anticiparse; y puede ser más larga que la que se solicita: asegúrese de administrar la superposición adecuada enjuagando según corresponda)
En cada uno de los hilos, estoy abriendo el mismo archivo y luego escribiendo en el archivo de acuerdo con la posición que es diferente para cada hilo. Entonces, ¿puedo seguir adelante e implementar correctamente? – Invictus
@Invictus: debe abrir el archivo para compartir. Todo lo demás debería funcionar. –
Otra solución, dependiendo del tamaño del archivo y del sistema en el que se está ejecutando, es usar memory mapped files, es decir. mapeo del archivo en la memoria virtual. Esto le daría acceso directo al archivo como si fuera una pieza de memoria. De esta forma, cualquier número de hilos simplemente puede escribir en la región de la memoria y las llamadas subsiguientes para enjuagar la asignación al disco (dependiendo de la configuración de la asignación de memoria) simplemente almacenará los datos en el disco.
Tenga en cuenta que debido a las restricciones de direcciones en las plataformas de 32 bits, no será posible mapear ningún archivo más grande que generalmente 2-3 GB, dependiendo de la arquitectura y el número real de bits disponibles para hacer virtual dirección de la memoria La mayoría de los sistemas de 64 bits tienen 48 bits o más disponibles para esta tarea, lo que te permite mapear al menos 256 TB, lo cual yo diría que es más que suficiente.
Tengo un sistema operativo freebsd, entonces, ¿crees que puedo usar el mapeo de memoria? – Invictus
Sí. Prácticamente todos los UNIX modernos admiten mapeo de memoria a través de la función 'mmap'. La página _man_ brinda muchos más detalles al respecto, que en su caso sería [como este] (http://nixdoc.net/man-pages/FreeBSD/mmap.2.html). Generalmente, los pasos necesarios son simplemente abrir un descriptor de archivo, preasignar el tamaño de la misma si es necesario (manualmente o a través de fallocate o posix_fallocate) y luego asignarlo a la memoria y listo. –
Pero, el problema aquí es que estoy usando una tabla hash para almacenar los datos entrantes y, quiero escribir esto en el archivo de salida ... Entonces, ¿hay alguna manera? – Invictus
- 1. ¿Pueden los procesadores XSLT tener múltiples subprocesos?
- 2. ¿Los subprocesos pthread funcionan en subprocesos si están en la memoria compartida?
- 3. ¿System.nanoTime() es coherente en todos los subprocesos?
- 4. Comprensión de varios subprocesos
- 5. Escribir en FileOutputStream desde varios subprocesos en Java
- 6. Lectura de un único archivo de varios subprocesos en python
- 7. Decapado de varios subprocesos en Python
- 8. Escribir en un archivo de varios subprocesos de forma asincrónica C#
- 9. DecimalFormat.format (doble) en diferentes subprocesos
- 10. cómo descargar un solo archivo con varios subprocesos en C#
- 11. Ejecutar tareas en varios subprocesos en node.js
- 12. se notificará cuando se hayan terminado todos los subprocesos de subprocesos de subprocesos
- 13. Java: sincronización de subprocesos en varios servidores
- 14. Cómo matar todos los subprocesos de shell?
- 15. Creación de número dinámico de subprocesos simultáneamente
- 16. Monitor.Enter y Monitor.Exit en diferentes subprocesos
- 17. ¿Los subprocesos están esperando en una cerradura FIFO?
- 18. ¿Usarás varios subprocesos con un rendimiento de ayuda de RandomAccessFile?
- 19. ¿Es seguro leer de varios subprocesos?
- 20. Transacción de Entity Framework con varios subprocesos
- 21. vim editar varias ubicaciones simultáneamente
- 22. ¿Pueden 2 subprocesos Java autenticarse como dos usuarios diferentes de Kerberos (en el mismo proceso)?
- 23. Cómo copiar un archivo en muchas ubicaciones simultáneamente
- 24. python: se agrega al mismo archivo desde varios subprocesos
- 25. Gestión de sesiones de Spring + Hibernate en varios subprocesos
- 26. Cree varios subprocesos y espere todos para completar
- 27. ¿Realmente Node.js usa varios subprocesos debajo?
- 28. ¿Cómo salir de todos los subprocesos en ejecución?
- 29. ¿Python usará todos los procesadores en el modo de subprocesos?
- 30. Creando miles de subprocesos rápidamente y ejecutándolos casi simultáneamente
Si necesita acceso simultáneo a un archivo no secuencial, le recomendaría usar un archivo mapeado en memoria. Luego, simplemente trátelo como la memoria normal y realice su propio bloqueo (que no es necesario si puede garantizar que las ubicaciones de escritura/lectura no se superpongan). –