CUDA'nın __synchtreads()
işlevinin Ruby'deki davranışını "çoğaltmaya" çalışıyorum. Özellikle, bazı kod yürütmesi gereken N
iş parçacığı bir dizi var, daha sonra işlerinin geri kalanı ile devam etmeden önce hepsi yürütme orta noktasında birbirlerini beklemek. Örneğin:Ruby'de bir eşitleme engelinin uygulanması
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 }
Bunu yapmak için hangi araçları kullanmam gerekiyor? Küresel bir karma kullanmayi denedim ve sonra tüm ileti dizileri kodun ilk kismi ile bittigini belirten bir bayrak ayarlayana kadar uyumaya çalistim. Düzgün çalışması için onu alamadım; Bu asılı ve kilitlenme ile sonuçlandı. Ben düşünMutex
ve ConditionVariable
'un bir kombinasyonunu kullanmam gerekiyor ama neden/nasıl olduğu konusunda emin değilim.
Düzeltme: 50 görünüm ve cevap yok! Bir ödül için bir aday gibi görünüyor ...
@sawa Aslında, yukarıdaki kod gösterimde bulunan hatayı buldum ve işe başladım, ancak daha temiz önerilerde bulunacağım. '' Sleep() 'kötü uygulama mıdır? – user2398029
'uyku 'iyi bir uygulama değildir. Kesinlikle kaçınmanız gereken bir şey değildir, ancak mümkün olduğunda kaçınmaya çalışın. Bir şekilde 'Thread # join' kullanabileceğinizi veya 'Fiber' kullanabileceğinizi hissediyorum. – sawa
Teşekkürler, 'fiber'i bir etiket olarak ekleyeceğim. – user2398029