著作一覧 |
threads = [] counter = 0 threads << Thread.new do 1.upto(100) do counter += 1 Thread.pass if rand(3) == 1 end end threads << Thread.new do 1.upto(100) do counter -= 1 Thread.pass if rand(3) == 1 end end threads.each(&:join) p counter
しかし次のは0が表示されるとは限らない。バグはコードにある。
using System; using System.Linq; using System.Threading; public class Th { static void Main() { var counter = 0; var threads = new Action[] { () => { var pause = new Random(); for (var i = 0; i < 100; i++) { ++counter; if (pause.Next(3) == 1) Thread.Sleep(0); } }, () => { var pause = new Random(); for (var i = 0; i < 100; i++) { --counter; if (pause.Next(3) == 1) Thread.Sleep(0); } }, }; foreach (var r in threads.Select((a) => { return a.BeginInvoke((result) => { a.EndInvoke(result); }, null); }).Reverse()) { r.AsyncWaitHandle.WaitOne(); } Console.WriteLine(counter.ToString()); } }
で、それは良いのだが、多分、Reverseがあると無いとで結果が変わるだろうなぁというのは正しい?
ジェズイットを見習え |