Domanda

Ho implementato questa piccola idea di gioco, che è (in qualche modo?) Simile al gioco della vita di Conway:

0) Hai una matrice di punti colorati (valori RGB) 1) Se la cella adiacente ha un valore x inferiore rispetto al tuo y, inserire y= 0 su quella cella (Dove x e y sono rossi || verde || blu) 2) Beats Red Beats Green Beats Blue Beats Red

Che cosa sto facendo ora è solo una cella per cellulare, controllando se le regole di cui sopra sono soddisfatte.Tuttavia, il comportamento non è proprio ciò che intendevo poiché a volte le cellule sulle prime righe hanno vantaggio su quelle delle righe finali.

Multithreading può impedire questo (ad esempio, lanciare due fili, un inizio nella prima cella e l'altro sull'ultimo)?Per favore, perdona la mia ignoranza in concorrenza, ma ho sentito che questo è stato un bel modo di iniziare a lavorare con esso.

È stato utile?

Soluzione

La mia ipotesi è che stai aggiornando la matrice in place, mentre si dovrebbe copiare mantieni una traccia del vecchio stato della matrice, aggiornando uno nuovo, quindi sostituire l'originale con l'aggiornamento. In questo modo, non aggiorni alcune celle, quindi sulla riga successiva test dei loro valori. Pertanto, sarebbe un problema algoritmo, non correlato al programmazione (e quindi il multithreading non può aiutare).

Altri suggerimenti

no.Il tuo problema è un difetto intrinseco.Il problema che hai è che stai usando risultati intermedi, I.e., il cambiamento in una cella influisce immediatamente sulla cella successiva, in questo aggiornamento.Non dovrebbeÈ necessario creare una nuova matrice, conservare i valori modificati in là, quindi scambiarli in modo che i nuovi valori siano caricati.Ripeti.

Starai meglio ad adattare il tuo algoritmo per impedirlo.

Affidarsi al multithreading per cambiare il comportamento non è una buona cosa.Questo è, in sostanza, cercando di introdurre una condizione di gara nel tuo codice.Normalmente, quando si aggiunge il multi-threading a un algoritmo, la prima priorità è quella di Prevenire Eventuali modifiche del comportamento.

Cercando di utilizzare una condizione di gara per cambiare il comportamento, stai rendendo questo molto non deterministico, ma non in modo buono.Saresti molto meglio cercando di trovare una soluzione diversa a questo (potenzialmente utilizzando un generatore di numeri pseudo-casuali, ecc.), Quindi introducendo il multi-threading per renderlo più veloce (si spera senza influire sui risultati).

.

Dipende da quale parte dell'elaborazione scegli di multithread. Il prototipo Esempio multithreading è il moltiplicatore Matrix. Puoi fondamentalmente rompere i quadranti e calcolare un quadrante in ogni thread, senza condivisione di informazioni tranne la matrice originale. Si noti che il gioco della vita è una matrice sparsa, però, e può o non può beneficiare di multithreading.

Tuttavia, se decidi di farlo, tieni presente che tutto dovrebbe calcolare ciò che ha bisogno per il "turno successivo" e posizionarlo in una nuova matrice, quando si scambia la matrice (preferibilmente non copiare, basta cambiare un pointore da qualche parte) alla fine della svolta, in modo che un thread non stia cambiando i valori che gli altri devono fare i loro calcoli. Quindi il thread non può essere permesso di "ottenere una svolta" di ciascuno Altro. Ciò potrebbe significare che risulta essere inefficiente da fare con più fili - il tuo chilometraggio può variare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top