トップ «前の日記(2011-09-04) 最新 次の日記(2011-09-06)» 編集

日々の破片

著作一覧

2011-09-05

_ RubyとC#

以下は最後に0が表示される。されなければバグ。
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があると無いとで結果が変わるだろうなぁというのは正しい?


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|

ジェズイットを見習え