gpt4 book ai didi

c# - .NET 中的随机和线程问题

转载 作者:太空狗 更新时间:2023-10-29 22:56:11 26 4
gpt4 key购买 nike

我在使用 Random 时遇到了问题在 .NET 类中,我正在实现一个工作正常的线程集合,除了一个较小的细节。该系列是一个 Skip list熟悉它的人都知道,对于插入的每个节点,我都需要生成一个新高度,即 <= CurrentMaxHeight+1 ,这是我用来执行此操作的代码(我知道它效率很低,但它可以工作,这是我现在的主要优先事项)

int randomLevel()
{
int height = 1;

while(rnd.NextDouble() >= 0.5 && height < MaxHeight)
++height;

return height;
}

我的问题是,有时我连续几千个元素只能从中返回 1,这会破坏跳过列表的性能。 10.000 个元素连续通过此方法仅生成 1 个的机会似乎非常渺茫(发生得相当一致)。

所以我假设(猜测) Random 有问题以某种方式反对,但我真的不知道从哪里开始挖掘。所以我转向stackoverflow看看有没有人有想法?

编辑

rnd 变量在类 SkipList<T> 中声明, 并从多个线程访问它(每个线程在集合上调用 .Add 并调用 .randomLevel)

最佳答案

尝试锁定 Random 对象。

int RandomLevel()
{
int height = 1;

lock(rnd)
{
while(rnd.NextDouble >= 0.5 && height < MaxHeight) height++;
}

return height;
}

当多个线程同时访问 Random 对象时,可能会出现冲突问题,并且种子可能会损坏。我无法对具体可能发生的事情提供任何见解,但根据 MSDNRandom 类型的实例成员不能保证是线程安全的,因此在任何情况下似乎都需要一个lock

关于c# - .NET 中的随机和线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1532046/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com