Sto provando a "replicare" il comportamento della funzione __synchtreads()
di CUDA in Ruby. Nello specifico, ho un set di thread N
che devono eseguire del codice, quindi tutti si aspettano l'un l'altro a metà del punto dell'esecuzione prima di continuare con il resto della loro attività. Ad esempio:Implementazione di una barriera di sincronizzazione in Ruby
x = 0
a = Thread.new do
x = 1
syncthreads()
end
b = Thread.new do
syncthreads()
# x should have been changed
raise if x == 0
end
[a,b].each { |t| t.join }
Quali strumenti sono necessari per eseguire questo? Ho provato a utilizzare un hash globale e quindi a dormire fino a quando tutti i thread hanno impostato un flag che indica che sono stati completati con la prima parte del codice. Non riuscivo a farlo funzionare correttamente; ha provocato blocchi e stallo. I penso Devo usare una combinazione di Mutex
e ConditionVariable
ma non sono sicuro del perché/come.
Modifica: 50 visualizzazioni e nessuna risposta! Sembra un candidato per una taglia ...
@sawa In realtà ho trovato il bug nel mio codice mostrato sopra e l'ho fatto funzionare ma sono aperto a suggerimenti più chiari. 'Sleep()' è considerato una cattiva pratica? – user2398029
'sleep' non è una buona pratica. Non è qualcosa da evitare assolutamente, ma cerca di evitare quando possibile. Ho la sensazione che tu possa in qualche modo utilizzare 'Thread # join 'o usare' Fiber'. – sawa
Grazie, aggiungerò 'fiber' come tag. – user2398029