Pregunta

He estado implementando esta pequeña idea de juego, que es (de alguna manera?) Similar al juego de la vida de Conway:

0) Tiene una matriz de puntos de colores (valores RGB) 1) Si la celda adyacente tiene un valor X más bajo que su Y, pon y= 0 en esa celda (Donde x e y son rojos || verde || azul) 2) Beats rojos Green Beats Blue Beats Red

Qué estoy haciendo ahora es simplemente ir con células por celda, verificando si se cumplen las reglas anteriores.Sin embargo, el comportamiento no es exactamente lo que pretendo, ya que a veces las células en las primeras filas tienen ventaja sobre aquellos en las filas terminales.

¿Puede MultiPhreading evitar esto (digamos, lanzando dos hilos, uno que se inicia en la primera celda y el otro en el último)?Por favor, perdona mi ignorancia por la concurrencia, pero sentí que esta era una buena manera de comenzar a trabajar con él.

¿Fue útil?

Solución

Mi conjetura es que está actualizando la matriz en su lugar, mientras que debe copiar mantener una pista del estado antiguo de la matriz, actualizando una nueva, luego reemplazando el original por el actualizado. De esta manera, no actualizará algunas celdas, luego en la siguiente línea pruebe sus valores. Por lo tanto, sería un problema de algoritmo, no relacionado con la programación (y, por lo tanto, el multiprito no puede ayudar).

Otros consejos

no.Tu problema es un fallo inherente.El problema que tiene es que está utilizando resultados intermedios, es decir, el cambio en una celda afecta a la próxima celda inmediatamente, en esta actualización.No debería.Debe crear una nueva matriz, almacene los valores modificados allí, y luego intercambiarlos para que los nuevos valores estén cargados.Repetir.

Estará mejor adaptando su algoritmo para evitar esto.

Confiando en MultiPhreading para cambiar el comportamiento no es algo bueno.Esto es, en esencia, tratando de introducir una condición de carrera en su código.Normalmente, al agregar multi-roscado a un algoritmo, la primera prioridad es para prevenir cualquier cambio en el comportamiento.

Al intentar usar una condición de raza para cambiar el comportamiento, está haciendo esto muy no determinista, pero no de buena manera.Estaría mucho mejor intentando crear una solución diferente a esto (potencialmente utilizando un generador de números pseudo-aleatorios, etc.), y luego introducir multi-roscado para que sea más rápido (con suerte sin afectar los resultados).

Depende de qué parte del procesamiento elija MultiPhread. La prototípico El ejemplo de MultiPhreading es el multiplicador de matriz. Básicamente, puede romperlo en cuadrantes y calcular un cuadrante en cada hilo, sin compartir información, excepto la matriz original. Tenga en cuenta que el juego de la vida es una matriz escasa, sin embargo, y puede o no beneficiarse de MultiShreading.

Sin embargo, si decides hacerlo, tenga en cuenta que todo debe calcular lo que necesita para el " la siguiente vuelta "y colóquela en una nueva matriz, cuando cambie la matriz (preferiblemente no copia, Simplemente cambie un puntero en algún lugar) al final del turno, de modo que un hilo no esté cambiando los valores que los otros deben hacer sus cálculos. Por lo tanto, no se puede permitir que los hilos se puedan "obtener un giro por delante" de cada uno otro. Esto podría significar que resulta ser ineficiente para hacer con múltiples hilos: su kilometraje puede variar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top