Ich versuche, das Verhalten der CUDA __synchtreads()
-Funktion in Ruby zu "replizieren". Genauer gesagt, habe ich eine Reihe von N
Threads, die Code ausführen müssen, dann warten alle aufeinander zum Zeitpunkt der Ausführung, bevor sie mit dem Rest ihres Geschäfts fortfahren. Zum Beispiel:Implementieren einer Synchronisierungsbarriere 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 }
Welche Tools muss ich verwenden, um dies zu erreichen? Ich habe versucht, einen globalen Hash zu verwenden und dann zu schlafen, bis alle Threads ein Flag gesetzt haben, das anzeigt, dass sie mit dem ersten Teil des Codes fertig sind. Ich konnte es nicht richtig funktionieren lassen; es führte zu Hängen und Stillstand. Ich denke, Ich muss eine Kombination von Mutex
und ConditionVariable
verwenden, aber ich bin unsicher, warum/wie.
Bearbeiten: 50 Aufrufe und keine Antwort! Sieht aus wie ein Kandidat für ein Kopfgeld ...
@sawa Ich habe den Fehler in meinem oben gezeigten Code gefunden und habe ihn zur Arbeit gebracht, aber ich bin offen für sauberere Vorschläge. Wird 'sleep()' als schlechte Praxis angesehen? – user2398029
'Schlaf' ist keine gute Übung. Es ist nicht etwas, das Sie unbedingt vermeiden sollten, aber versuchen Sie es möglichst zu vermeiden. Ich habe das Gefühl, dass du irgendwie "Thread # Join" oder "Fiber" verwenden kannst. – sawa
Danke, ich werde 'fiber' als Tag hinzufügen. – user2398029