相关疑难解决方法(0)

在多线程应用程序中使用Random的正确方法

好.以下是我所知道的不起作用:

int Rand()
{
    //will return the same number over and over again
    return new Random().Next();
}

static Random rnd=new Random();

int Rand()
{
    //if used like this from multiple threads, rnd will dissintegrate 
    //over time and always return 0
    return rnd.Next();
}
Run Code Online (Sandbox Code Playgroud)

这将正常工作,但如果由多个线程使用,CPU使用率上升,我不想要,我认为没有必要:

int Rand()
{
    lock(rnd)
    {
        return rnd.Next();
    }
}
Run Code Online (Sandbox Code Playgroud)

那么,c#是否有一个线程安全的Random类,或者更好的方法来使用它?

c# random

43
推荐指数
3
解决办法
1万
查看次数

初始化ThreadStatic字段仍会导致NullReferenceException

我自己写了一个多线程随机生成器

public static class MyRandGen
{
    private static Random GlobalRandom = new Random();
    [ThreadStatic]
    private static Random ThreadRandom = new Random(SeedInitializer());
    private static int SeedInitializer()
    {
        lock (GlobalRandom) return GlobalRandom.Next();
    }

    public static int Next()
    {
        return ThreadRandom.Next();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,它在抛出Next()时抛出了NullReferenceException,我不明白.这种初始化ThreadStatic字段是否被禁止?

我知道我可以检查每次都是否已初始化该字段,但这不是我正在寻找的解决方案.

c# random thread-safety threadstatic

37
推荐指数
1
解决办法
7989
查看次数

在线程中设置全局变量 - C#

我有一个HTTP服务器,我正在使用HTTP侦听器编写,我想以某种方式声明某些变量可以从一个线程内的任何地方访问.

  • 我的webserver类是基于实例的,所以我不能真正使用静态变量.
  • 我可以使用实例变量,因为所有代码都在一个类中,但是......我不知道.

我想过使用字典:Dictionary</*[type of Thread ID here]*/,ThreadData>但是我担心可能存在线程问题.ThreadData可能是一个类的实例,但我可能会使用一个结构,取决于哪个会更有效.

  • 如果我将字典键入线程ID并对其进行编程,以便一个线程在字典中询问自己的条目,那么在访问字典时是否会出现与线程相关的问题?
  • 每个线程都会添加自己的条目.在添加新的线程项时,我是否必须锁定字典?如果是这样,我是否能够使用单独的锁对象来允许线程同时访问自己的数据?

使用并发字典会有优势吗?还有另一种更安全的线程方式吗?

我目前正在使用ThreadPool.QueueUserWorkItem.我不确定这会为每个项目使用一个新线程.如果没有,那么我也可以将它键入上下文.

更新:根据ThreadPool类 - MSDN,它确实重用了线程.它并没有清除线程数据.

当线程池重用线程时,它不会清除线程本地存储中或使用ThreadStaticAttribute属性标记的字段中的数据.因此,当方法检查线程本地存储或使用ThreadStaticAttribute属性标记的字段时,它找到的值可能会从先前使用的线程池线程中遗留下来.

c# .net-4.0 thread-safety

23
推荐指数
2
解决办法
2万
查看次数

什么是线程上下文?

线程的上下文是否指向线程的个人内存?如果是这样,多个线程之间如何共享内存?

我不是在寻找代码示例 - 我在高层次上理解同步,我只是对这个术语感到困惑,并且希望对场景背后的实际情况有所了解.

我认为/认为每个线程都有某种私有内存的原因是因为Java和.NET中的volatile关键字,以及如果不使用相同的原语,不同的线程如何可以具有不同的值.那总是暗示着我的私人记忆.

由于我没有意识到这个术语更为通用,我想我是在问Java和C#中的上下文切换是如何工作的.

c# java multithreading synchronization

21
推荐指数
2
解决办法
1万
查看次数

是否在后台工作者调用之间保留了线程本地存储?

后台工作线程是否重复使用?

具体来说,如果我在后台工作程序的DoWork()方法中设置了一个命名数据槽(线程局部存储),那么该数据槽的值是否会持续存在,以后可能会发现某个其他线程?

我不会这么想,但我有这个错误......

编辑:这篇博客文章表明BackGroundWorker使用ThreadPool,这意味着线程重用.所以问题就变成了; 重用线程是否可能在调用之间持久保存线程本地存储?

.net c# multithreading backgroundworker thread-local

13
推荐指数
1
解决办法
2385
查看次数

使用静态方法生成随机数是一种好习惯吗?

我编写了以下用于生成随机数floatdouble数字的代码.

public static class Statics
{
    private static readonly Random random = new Random();
    private static readonly object syncLock = new object();

    public static double getRandomDouble(double min, double max)
    {
        lock (syncLock)
        {
            return random.NextDouble() * (max - min) + min;
        }
    }

    public static float getRandomFloat(float min, float max)
    {
        lock (syncLock)
        {
            return (float)random.NextDouble() * (max - min) + min;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以使用static class和生成随机数的方法吗?

我的程序在很大程度上依赖于这些方法,所以我想确保生成的数字确实是随机的.这些发生器被许多物体使用但不同时使用.

.net c# random static

1
推荐指数
1
解决办法
126
查看次数

在Parallel.For中使用Random

我的程序执行许多模拟,每个模拟都需要生成许多随机数。串行方法很简单并且有效。但是,在追求并行化工作的过程中,我相信我创造了一种比我能找到的方法更直接的方法。其他方法有些过时了,现在有可能以前无法做到。

我是否缺少使我的方法容易受到无数多线程问题困扰的东西?我的方法使用a的能力Parallel.For为单个线程实例化变量,因此不需要像我发现的其他方法那样的其他类。在这种情况下,每个线程都有自己的线程Random

定时:

我的方法:4秒

斯蒂芬:14岁

乔恩:16岁

显然,我对斯蒂芬或乔恩的了解不多,所以我担心自己错过了一些东西。

我的方法:

Random rnd = new Random();
int trials = 1_000_000;

private readonly object globalLock = new object();
ParallelOptions po = new ParallelOptions();
po.MaxDegreeOfParallelism = 4;

await Task.Run(() =>
{
    Parallel.For<Random>(0, trials, po, 
    () => { lock(globalLock){ return new Random(rnd.Next()); } }, 
    (i, loop, local) =>
    {
        for (int work = 0; work < 1000; work++)
        {
            local.Next();
        }

        return local;
    },
        (x) => { }
    );
});
Run Code Online (Sandbox Code Playgroud)

接下来的方法是MSDN …

c# random multithreading parallel.for

1
推荐指数
1
解决办法
608
查看次数