Last active
January 1, 2016 07:09
-
-
Save kagamilove0707/8109412 to your computer and use it in GitHub Desktop.
並列化時代のためのFizzBuzzですー>ω<
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
################################################################# | |
#並列化時代のためのFizzBuzzです~>ω< | |
#Author : 月影 | |
#Date : 2013/12/24 | |
#License : お好きにどうぞ(Public Domainというやつですー>ω<) | |
#Comment : 聖なる夜に何をやっているんでしょう……( ̄▽ ̄ll) | |
################################################################# | |
#プログラムを止める際に実行されますです~>ω< | |
#下の方で無限ループしているので、Ctrl-Cで止めてくださいです(≧∇≦)b | |
Signal.trap:INT do | |
puts "Good-bye^^" | |
exit 0 | |
end | |
#FizzBuzzを表示する1ステップにかかる時間です~>ω< | |
#小さくするほど速度は上がりますが、その分精度が悪くなりますです>< | |
#また、実行環境や実行時のCPUの状態にも依存すると思うのです! | |
stepTime = 0.01 | |
#出力するデータが入る配列ですー>ω< | |
output = [] | |
#スレッド間でoutputを共有するためのMutexです(ところでMutexの訳って何なのです??) | |
m = Mutex.new | |
#3ステップ毎にoutputにFizzを追加するスレッドですー>ω< | |
fizz = Thread.new do | |
loop do | |
sleep 3 * stepTime | |
m.synchronize { output << :Fizz } | |
end | |
end | |
#5ステップ毎にoutputにBuzzを追加するスレッドですー>ω< | |
buzz = Thread.new do | |
loop do | |
sleep 5 * stepTime | |
m.synchronize { output << :Buzz } | |
end | |
end | |
#表示がFizzやBuzzが追加されたあとに行なわれるように、sleepを入れますです(* ̄∇ ̄*) | |
sleep stepTime / 10.0 | |
#メインとなる無限ループですー>ω< | |
(1..Float::INFINITY).each do |i| | |
#ここでMutexをsleepしている間に恐らく、FizzやBUzzの追加が行なわれようとしますが、止められます。 | |
m.synchronize { m.sleep stepTime } | |
#ここで、止まっていたFizzやBuzzの追加が実行されます。 | |
#出力している間にoutputを更新されても困るので、ここもsynchronizeしておきますです>ω< | |
m.synchronize do | |
puts output.empty? ? i : output.sort.reverse.join | |
output = [] | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment