Ho scritto del codice per manipolare i grafici sparsi per il lavoro scolastico che sto facendo, e ho un'operazione che richiede il loop su tutti i bordi di un grafico. L'interfaccia che devo implementare è una funzione
int gimme_some_edges(graph* g, int k, int* I, int* J)
che colloca i prossimi k
bordi del grafico g
nelle matrici I
e J
, e restituisce il numero di bordi effettivamente trovati nel caso in cui ci siano meno di k
rimasti. Lo pattern iteratore sembra lo strumento per il lavoro.
La più grande considerazione di cui voglio tenere conto è che il mio programma è parallelo; ogni thread è responsabile dell'elaborazione di un sottoinsieme disgiunto dei bordi del grafico. In tal caso, il lato corrente dell'iteratore deve essere privato per ogni thread e l'iteratore deve essere fermato per continuare oltre qualche punto finale nei bordi per i quali un altro thread è responsabile.
Voglio che gli iteratori del bordo grafico siano interni o esterni agli oggetti grafici?
Se l'iteratore del bordo del grafico è esterno e chiamato dal client, c'è ancora molto da fare nella manutenzione di questo oggetto ma il parallelismo è diretto. Inoltre, verranno eliminati alla fine della funzione di elaborazione dei bordi.
D'altra parte, se l'iteratore è una parte del grafico, il mio codice sembra più semplice sulla superficie. Ma, devo assicurarmi di archiviarne un array, uno per ogni thread. Sono anche persistenti, quindi il loro stato può diventare fasullo prima dell'elaborazione del bordo successivo, a meno che non sia cauto (non ci scommettere).