c# - 如何使用PLINQ并行处理周期?

标签 c# plinq

我的任务是使用PLINQ并行化迭代。为此,我有一个基于循环的功能:

public void PointGenerator(int n, Random rnd)
{
    for (int i = 1; i <= n; i++)
    {
        x = rnd.NextDouble(); 
        y = rnd.NextDouble(); // 
        if (((x - 0.5) * (x - 0.5) + (y - 0.5) * (y - 0.5)) < 0.25)
        {
            N_0++;
        }
    }
}


如何使用PLINQ做到这一点?

最佳答案

您可以这样尝试:

public bool Check(double x, double y)
{
    return ((x - 0.5) * (x - 0.5) + (y - 0.5) * (y - 0.5)) < 0.25;    
}

// ...

N_0 = Enumerable
    .Range(0, n)
    .Select(i => new { X = rnd.NextDouble(), Y = rnd.NextDouble() })
    .AsParallel()
    .Count(p => Check(p.X, p.Y));


正如Roman Dvoskin在其他答案下的注释中所指出的,Random对象不是线程安全的:


  但是,随机对象不是线程安全的。如果您的应用从多个线程调用随机方法,则必须使用同步对象来确保一次只有一个线程可以访问随机数生成器。如果不确保以线程安全的方式访问Random对象,则对返回随机数的方法的调用将返回0。


通过首先生成所有XY对,可以解决此问题。

关于c# - 如何使用PLINQ并行处理周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25471848/

相关文章:

c# - ConcurrentQueue 上的 PLINQ 不是多线程

c# - ParallelQuery 核心平衡

C# WinForms 搞乱了控制位置?

c# - Xamarin 表单主详细信息页面未显示

c# - Directory.GetFiles() 性能问题

c# - P-Linq 可以在委托(delegate)执行期间切换线程吗?

c# - 何时处置 CancellationTokenSource?

c# - 创建 Messenger 服务

c# - 如何从 .dll 访问应用程序配置?

c# - WithDegreeOfParallelism(N>CPU 数量)