カイ、私はあなたがスレッドを使ってあなたが望むことをするプログラムを提供しました。これは、次の条件でライセンスされています。実行するCPUコアごとに1時間あたり$ 0.0001を支払う必要があります。料金は各月末に支払われます。できるだけ早くペイパルアカウントの詳細をご連絡ください。
using System;
using System.Collections.Generic;
using System.Linq;
namespace GuidCollisionDetector
{
class Program
{
static void Main(string[] args)
{
//var reserveSomeRam = new byte[1024 * 1024 * 100]; // This indeed has no effect.
Console.WriteLine("{0:u} - Building a bigHeapOGuids.", DateTime.Now);
// Fill up memory with guids.
var bigHeapOGuids = new HashSet<Guid>();
try
{
do
{
bigHeapOGuids.Add(Guid.NewGuid());
} while (true);
}
catch (OutOfMemoryException)
{
// Release the ram we allocated up front.
// Actually, these are pointless too.
//GC.KeepAlive(reserveSomeRam);
//GC.Collect();
}
Console.WriteLine("{0:u} - Built bigHeapOGuids, contains {1} of them.", DateTime.Now, bigHeapOGuids.LongCount());
// Spool up some threads to keep checking if there's a match.
// Keep running until the heat death of the universe.
for (long k = 0; k < Int64.MaxValue; k++)
{
for (long j = 0; j < Int64.MaxValue; j++)
{
Console.WriteLine("{0:u} - Looking for collisions with {1} thread(s)....", DateTime.Now, Environment.ProcessorCount);
System.Threading.Tasks.Parallel.For(0, Int32.MaxValue, (i) =>
{
if (bigHeapOGuids.Contains(Guid.NewGuid()))
throw new ApplicationException("Guids collided! Oh my gosh!");
}
);
Console.WriteLine("{0:u} - That was another {1} attempts without a collision.", DateTime.Now, ((long)Int32.MaxValue) * Environment.ProcessorCount);
}
}
Console.WriteLine("Umm... why hasn't the universe ended yet?");
}
}
}
PS:Parallel extensionsライブラリを試してみたかった。それは簡単でした。
そして、制御フローとしてOutOfMemoryExceptionを使用すると、間違っているように感じます。
編集
まあ、これはまだ投票を集めているようです。そこで、GC.KeepAlive()の問題を修正しました。そして、C#4で実行するように変更しました。
そして、私のサポート条件を明確にするために:サポートは2010年2月28日でのみ利用可能です。タイムマシンで当日のみサポートをお願いします。
編集2
いつものように、GCはメモリの管理で私よりも優れています。それを自分でやろうとした以前の試みは失敗する運命にありました。