thr*_*thr 5 .net c# collections multithreading data-structures
我在使用.NET中的Random类时遇到问题,我正在实现一个工作正常的线程集合,除了一个较小的细节.该集合是一个Skip列表,熟悉它的人知道,对于插入的每个节点,我需要生成一个新的高度,这是<= CurrentMaxHeight+1我用来做这个的代码(我知道这是非常低效的,但它的工作原理)这是我现在的主要优先事项)
int randomLevel()
{
int height = 1;
while(rnd.NextDouble() >= 0.5 && height < MaxHeight)
++height;
return height;
}
Run Code Online (Sandbox Code Playgroud)
我的问题在于,有时候我连续几千个元素只能从这里获得一次,这会杀死跳过列表的性能.10.000个元素连续生成这个方法只有1个的机会,看起来非常渺茫(非常一致).
所以我假设(猜测)Random对象在某种程度上存在问题,但我真的不知道从哪里开始挖掘.所以我转向stackoverflow看看是否有人有想法?
编辑
rnd-variable在类中声明SkipList<T>,并且可以从多个线程访问(每个线程调用集合上的.Add和Add调用.randomLevel)
尝试lock使用该Random对象。
int RandomLevel()
{
int height = 1;
lock(rnd)
{
while(rnd.NextDouble >= 0.5 && height < MaxHeight) height++;
}
return height;
}
Run Code Online (Sandbox Code Playgroud)
Random当多个线程同时访问对象时,可能会出现冲突问题,并且种子可能会被损坏。我无法提供任何可能具体发生的情况的见解,但根据MSDN,该类型的实例成员Random不能保证是线程安全的,因此lock在任何情况下似乎都需要 a 。
| 归档时间: |
|
| 查看次数: |
222 次 |
| 最近记录: |