Estoy creando una aplicación de Windows en C# en la que quiero escribir en un archivo múltiple con varios hilos. Recibo datos de diferentes puertos y hay un archivo asociado a cada puerto. Es posible que la creación de hilo para cada puerto y usar el mismo hilo una y otra vez para escribir datos en el archivo respectivo? Supongamos que obtengo datos de los puertos 10000,10001,10002 y que hay tres archivos como 10000.txt, 10001.txt y 10002.txt. Tengo que crear tres hilos para escribir datos en estos tres archivos, respectivamente, y quiero utilizar estos hilos una y otra vez. ¿Es posible? ¿Puedes dar una pequeña muestra de código si es posible?¿Cómo escribir en un solo archivo con múltiples hilos?
Respuesta
Como se mencionó en los comentarios, esto está causando problemas.
Por lo tanto, es necesario tener una clase de escritor flujos seguros:
public class FileWriter
{
private ReaderWriterLockSlim lock_ = new ReaderWriterLockSlim();
public void WriteData(/*....whatever */)
{
lock_.EnterWriteLock();
try
{
// write your data here
}
finally
{
lock_.ExitWriteLock();
}
}
} // eo class FileWriter
Esto es adecuado para ser llamado por muchos hilos. PERO, hay una advertencia. Puede haber una disputa de bloqueo. Utilicé una clase ReadWriterLockSlim
, porque es posible que también desee realizar bloqueos de lectura e infierno, esa clase también le permite actualizar desde un estado de lectura.
Gracias por responder, escribí solo un método para escribir en el archivo y paso solo parámetros diferentes para ese método. Pero si uso LOCK para el método de escritura, solo un hilo puede acceder a ese método. Esto no sirve para nada. yo. – Dany
@Dany, varios hilos más + 1 archivo = malas noticias. ¿Cuál es tu caso de uso? –
varios hilos más + 1 archivo no es mi caso. Mi caso es múltiples hilos y múltiples archivos. – Dany
Deberá serializar los hilos y gestionar el cierre y la apertura de las llamadas a archivos. Y probablemente use append en lugar de write ... Puede usar una clase de gestor de hilos (más como el hilo principal) para ayudar a sincronizar todos sus otros hilos. Aunque lo mejor probablemente sea usar un hilo dedicado para escribir en ese archivo ...
Gracias por la respuesta, pero ¿puedo crear un hilo dedicado para un archivo en particular y otro hilo para otro archivo y así sucesivamente? – Dany
@Dany: a menos que tenga un hilo que siempre esté ejecutándose, el mismo hilo manejará la escritura en cualquiera de sus archivos.Incluso la respuesta aceptada no generará un nuevo hilo para escribir en el archivo, solo evitará varios hilos, desde la escritura hasta el mismo archivo al mismo tiempo. –
Las respuestas a otras publicaciones están algo fuera de línea con su pregunta original: parece que desea escribir en un archivo diferente por subproceso.
La respuesta fácil es ... solo hazlo - el sistema de archivos es seguro para subprocesos. El único inconveniente puede ser el rendimiento con solo un disco. La escritura simultánea y rápida de pequeños fragmentos de datos en muchos archivos puede provocar una gran cantidad de problemas en el disco, ya que el sistema de archivos intenta manejar los archivos/directorios distribuidos con solo un brazo de rotor. Los discos duros modernos con cachés grandes y controladores inteligentes mitigarán esto hasta cierto punto, pero es posible que tenga un problema. Pruébalo y mira!
Sus problemas aumentarán si planea crear y destruir continuamente subprocesos, abrir y cerrar archivos de datos para cada lectura de red entrante. Si puedes evitar esto, hazlo.
Si el disco no puede mantener el ritmo, puede implementar su propio algoritmo inteligente de "escritura diferida" para aumentar el tamaño de las escrituras del disco y así reducir el número, o comprar un SSD, o ambos.
- 1. Escribiendo en un solo archivo desde varios hilos en ruby
- 2. hilos log4net + + rodando múltiples appender archivo
- 3. Múltiples hilos o procesos con hilos
- 4. ¿Cómo aborto múltiples hilos?
- 5. Procesamiento de un solo archivo desde procesos múltiples en python
- 6. Escribir múltiples matrices numpy en el archivo
- 7. Cómo utilizar múltiples hilos
- 8. ScheduledExecutorService múltiples hilos en paralelo
- 9. Múltiples hilos y memoria
- 10. Cómo escribir un XML en un archivo, con solo una instancia de Parser?
- 11. Ejecutar múltiples hilos UI
- 12. ¿Cómo usar múltiples configuraciones con logback en un solo proyecto?
- 13. ¿Cómo escribir un flujo en un archivo?
- 14. ¿Cómo escribir un método/mensaje con múltiples parámetros?
- 15. ¿Cómo lidiar con múltiples hilos en una clase?
- 16. ¿Pueden varios hilos escribir datos en un archivo al mismo tiempo?
- 17. cómo escribir en un archivo en emacs
- 18. ¿Cómo escribir en un búfer de memoria con un ARCHIVO *?
- 19. Combine múltiples archivos JavaScript en un solo archivo JS
- 20. ¿Cómo registrar datos de múltiples hilos?
- 21. ¿Es posible definir múltiples clases en un solo archivo .cpp?
- 22. boost :: iostream zlib comprimiendo múltiples archivos en un solo archivo
- 23. ¿Cómo compilar un solo archivo con maven?
- 24. C++ - hilos y múltiples colas
- 25. Múltiples controladores con un solo modelo
- 26. ¿Sinatra tiene múltiples hilos?
- 27. Cómo compilar solo un archivo con sphinx
- 28. Lectura de flujo a un MemoryStream en múltiples hilos
- 29. ¿Entrar en un solo archivo con Mercurial?
- 30. Comandos automáticos de Vim: ¿escribir un archivo de solo lectura?
necesita serializar el acceso al archivo (por ejemplo, un Mutex o similar) o tener un hilo central responsable de escribir el archivo que cada otro hilo simplemente le dice qué escribir (ponga en cola el trabajo a realizar por ese hilo central) ... – Yahia
¿Por qué necesita escribir en un solo archivo desde múltiples hilos? Esta es una mala idea, no solo por la sincronización sino también por la mecánica de escribir en el archivo (bloqueos, etc.). – Oded
Aquí estoy obteniendo datos de diferentes puertos continuamente y hay diferentes archivos. Tres es un archivo asociado con un solo puerto. Quiero escribir los datos que provienen de un puerto al archivo respectivo. Deseo crear un hilo para cada dato entrante. escribirá esa información en un archivo particular y lo abortará, y así sucesivamente. – Dany