Question

J'ai mis en œuvre cette petite idée de jeu, qui est (en quelque sorte?) Semblable au jeu de la vie de Conway:

0) Vous avez une matrice de points de couleur (valeurs RVB) 1) Si la cellule adjacente a une valeur x inférieure à celle de votre y, mettre y= 0 sur cette cellule (Où x et y sont rouges || vert || bleu) 2) Beats rouges Green Beats Blue Beats Rouge

Qu'est-ce que je fais maintenant, il suffit de passer des cellules par cellule, de vérifier si les règles ci-dessus sont remplies.Cependant, le comportement n'est pas tout à fait ce que je voulais car parfois les cellules des premières lignes ont un avantage sur ceux des lignes finales.

Peut-être multithreading l'empêchent (par exemple, lancer deux threads, un initiant dans la première cellule et l'autre sur le dernier)?S'il vous plaît pardonner mon ignorance sur la concurrence, mais j'ai senti que c'était une bonne façon de commencer à travailler avec elle.

Était-ce utile?

La solution

Je suppose que vous mettez à jour la matrice surplace, alors que vous devriez copier garder une piste de l'ancien état de la matrice, à la mise à jour d'une nouvelle, puis remplacez l'original par le mis à jour. De cette façon, vous ne mettrez pas à jour certaines cellules, puis sur la ligne suivante, testez leurs valeurs. Ainsi, ce serait un problème d'algorithme, non liée à la programmation (et donc multithreading ne peut pas aider).

Autres conseils

non.Votre problème est une faille inhérente.Le problème que vous avez est que vous utilisiez des résultats intermédiaires, c'est-à-dire que la modification d'une cellule affecte immédiatement la cellule suivante, dans cette mise à jour.Ça ne devrait pas.Vous devez créer une nouvelle matrice, stocker les valeurs modifiées dans ce niveau, puis les échanger afin que les nouvelles valeurs soient chargées.Répéter.

Vous ferez mieux d'adapter votre algorithme pour éviter cela.

S'appuyer sur la multithreading pour changer le comportement n'est pas une bonne chose.C'est, en substance, essayant d'introduire une condition de race dans votre code.Normalement, lors de l'ajout de multi-filetage à un algorithme, la première priorité est de prévenir tout changement de comportement.

En essayant d'utiliser une condition de course pour changer de comportement, vous rendez cela très non déterministe, mais pas de bonne manière.Vous seriez beaucoup mieux pour essayer de trouver une solution différente à cet effet (potentiellement à l'aide d'un générateur de nombres pseudo-aléatoires, etc.), puis d'introduire plusieurs threading pour le rendre plus rapide (espérons-le sans affecter les résultats).

Cela dépend de la partie du traitement que vous choisissez de multithread. prototypical L'exemple de multithreading est le multiplicateur de matrice. Vous pouvez fondamentalement casser en quadrants et calculer un quadrant dans chaque fil, sans partage d'informations, à l'exception de la matrice d'origine. Notez que le jeu de la vie est une matrice rare, cependant et peut ou non bénéficier de multithreading.

Cependant, si vous décidez de le faire, gardez à l'esprit que tout devrait calculer ce dont il a besoin pour le "prochain tour" et le placer dans une nouvelle matrice, lors de l'échange de matrice (de préférence pas copie, il suffit de changer un pointeur quelque part) à la fin du tour, un thread ne modifie pas les valeurs que les autres doivent faire leurs calculs. Donc, le fil ne peut donc pas être autorisé à "faire demi-tour" de chacun autre. Cela pourrait signifier qu'il s'avère être inefficace à faire avec plusieurs threads - votre kilométrage peut varier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top