有沒有人可以給我一些代碼?
我們建議您創建單個 Random 實體來生成應用程式所需的所有亂數,而不是實體化單個 Random 物件。但是,隨機物件不是執行緒安全的。如果您的應用程式從多個執行緒呼叫 Random 方法,則必須使用同步物件來確保一次只有一個執行緒可以訪問亂數生成器。如果您不能確保以執行緒安全的方式訪問 Random 物件,則對回傳亂數的方法的呼叫將回傳 0。
MSDN
任何可以證明這一點的代碼
'如果您不確保以執行緒安全的方式訪問 Random 物件,則對回傳亂數的方法的呼叫將回傳 0'
謝謝
uj5u.com熱心網友回復:
如果您運行以下控制臺應用程式(RELEASE 構建),您應該會在輸出中看到偶爾出現的零序列。
它不會發生在每個隨機值上,但是當它發生時,你會連續得到很多零:
static class Program
{
static void Main()
{
var rng = new Random(12345);
Parallel.Invoke(
() => test(rng),
() => test(rng),
() => test(rng),
() => test(rng),
() => test(rng),
() => test(rng),
() => test(rng),
() => test(rng));
}
static void test(Random rng)
{
int[] numbers = new int[10000];
for (int i = 0; i < numbers.Length; i)
numbers[i] = rng.Next();
for (int i = 0; i < numbers.Length; i)
Console.WriteLine(numbers[i]);
}
}
請注意,對于 DEBUG 構建,它不會發生(或發生得更少);這是執行緒錯誤的本質。
它甚至不會在每次運行 RELEASE 版本時發生,但有時會發生(在我的 PC 上)。
uj5u.com熱心網友回復:
您可以像這樣構建一個簡單的執行緒安全隨機類
public class ThreadSafeRandom: Random
{
private object LockObject = new object();
public ThreadSafeRandom()
{ }
public ThreadSafeRandom(int Seed) : base(Seed)
{ }
public override int Next()
{
lock(LockObject)
{
return base.Next();
}
}
// and so on with other virtual methods...
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/409602.html
標籤:
