| 著作一覧 |
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があると無いとで結果が変わるだろうなぁというのは正しい?
ジェズイットを見習え |