Pasé 3 días depurando un error muy oscuro en una biblioteca hecha por mi colega, este error ocurre con poca frecuencia. Después de todo, descubrí que este error ocurre debido al acceso cruzado a un objeto sin ningún bloqueo. En realidad, este no es un primer error de este tipo, hubo errores similares antes. Simplemente ejecuta las pruebas de su unidad, y si algo falla, coloca un candado en alguna parte. Y si nada falla, ughm, entonces su código es perfecto. Parece que no tiene idea de enhebrar la seguridad. Estoy 100% seguro de que hay muchos errores similares que aún no han aparecido. Parece que PM no entiende cosas de subprocesos también.
El problema es que trabaja mucho más tiempo en la empresa que yo. De todos modos, no puedo decir "este tipo es incompetente en esta área", porque esto siempre te muestra como un "mal jugador de equipo", etc.
fuente
Respuestas:
Convencer al primer ministro de que para evitar tales errores, se debe mejorar el conocimiento del equipo sobre el enhebrado de cosas y decirles que está dispuesto a organizar algo como un taller o una presentación al respecto. No lo convierta en algo personal entre usted y su colega.
fuente
Escriba una prueba unitaria que muestre el error y pídale que lo arregle.
fuente
fuente
Creo que su empresa no debería estar usando subprocesos múltiples.
Después de hacer un proyecto multiproceso masivo, descubrí que dos técnicas eran críticas para hacer que las cosas funcionen. Primero , el código tenía que estar escrito correctamente. Todos los campos tenían que verificarse manualmente para asegurarse de que se declararan correctamente y que se sincronizaran correctamente donde se haga referencia. (Advertencia: estoy simplificando un poco las cosas aquí para que mi respuesta sea corta, o en cualquier caso, más corta). En segundo lugar , el código tuvo que probarse ejecutándolo en máquinas simples y multinúcleo, muchos minutos usando 100% de cada núcleo. (Y si solo usa el 2% de cada núcleo, como solía hacerlo para mí, también es un error).
Es posible que pueda administrar esto, pero su organización no puede. Incluso si entendieron el problema, que no lo hacen, no tienen la experiencia.
La mayoría de los idiomas proporcionan formas de evitar esto. Si tiene un lector de socket, que generalmente tiene su propio hilo, haga que obtenga la información en el hilo principal de la forma más rápida y sencilla posible. Mejor aún, busque las clases / funciones del sistema que manejarán la parte del hilo de la lectura por usted. Use una cola que ejecute "eventos" uno tras otro, como lo hacen la mayoría de las API de GUI. (Utilice la cola de eventos de la API GUI en sí misma). Si necesita un procesamiento paralelo, probablemente pueda encontrar algún tipo de "subproceso de trabajo" que le permita mantener datos / campos en un solo subproceso, manejando todas las transferencias por usted.
Haga hincapié en todos los peligros del subprocesamiento múltiple. (Historias de miedo: mi error favorito involucraba un par de líneas como:, lo
int i = 5; i = i * i;
que resultó eni
un valor de 35. Una que vi mucho fue:if (thing != null) thing.reset();
lanzar una excepción de puntero nulo). Creo que su única esperanza es hacerles entender que son entrando en un mundo nuevo, nuevo y extraño, y que tal vez deberían dar un gran paso atrás.No estoy muy seguro de cómo se debe manejar el subprocesamiento múltiple. Si el trabajo se puede dar a una persona, y todo lo que hacen se tira si fallan, está bien. Pero un equipo solo será tan fuerte como su miembro más débil, e incluso un buen programador tendrá problemas con el subprocesamiento múltiple completo. Espero que la gente del idioma encuentre la manera de hacerlo seguro. He visto algún software útil por ahí. Pero creo que es mejor evitar el subprocesamiento múltiple a menos que el tiempo de ejecución sea crítico y haya un buen programador o un equipo probado disponible.
fuente