gpt4 book ai didi

c# - 如何对同一数组中的随机位置执行多线程操作?

转载 作者:太空狗 更新时间:2023-10-30 01:04:52 25 4
gpt4 key购买 nike

我有一个进程在 Array 中的随机位置上运行大量任务,我想通过使用多线程来加快速度。

它的本质作用是随机化“数组”中的一个位置,检查其周围环境的值,并在满足一些特定条件时更改随机位置值。

是否可以运行类似

的东西
Parallel.For(0, n, s => { });

循环而不是下面显示的 while 代码块来优化此函数,执行此操作的代码块会是什么样子?

我一直在考虑为所选元素使用一些“繁忙”属性,但这实际上使问题变得比它可能需要的更复杂。

public void doStuffTothisArray(ref int[,,] Array, ref IGenerator randomGenerator, int loops)
{
int cc = 0;
int sw = 0;
do
{
if (doStuffOnRandomPositions(ref Array, ref randomGenerator))
sw++; //if stuff was made counter

if ((cc % (loops / 10)) == 0)
Console.Write("{0} % \t", (cc / (loops / 10)) * 10); //some loading info

cc++; //count iterations
} while (cc < loops);
Console.WriteLine("Stuff altered in {0} iterations: {1}", loops, sw);
}

后期编辑:

划分阵列和分配工作破坏了阵列的动态,因为它需要是一个完整的系统。

这是 dostuff..() 的原型(prototype)

public static bool doStuffOnRandomPositions(ref lattice A, ref IGenerator rr)
{
position firstPos = new position(rr.Next(0, A.n_size),rr.Next(0, A.n_size),rr.Next(0, A.n_size));
position secondPos = randomNeighbour(ref A, firstPos, ref rr);

//checks the closest 3d neighbours indexer the lattice
//Console.WriteLine("first:[{0},{1},{2}]\nsecond:[{3},{4},{5}]\n", firstPos.x, firstPos.y, firstPos.z, secondPos.x, secondPos.y, secondPos.z);

// get values at coordinates
bool first = A.latticeArray[firstPos.x, firstPos.y, firstPos.z];
bool second = A.latticeArray[secondPos.x,secondPos.y,secondPos.z];

if (first == second) //don't bother if they are equal states
return false;

// checks the energies in surroundings for an eventual spin switch
int surrBefore = surroundCheck(ref A, firstPos, first) ; // - surroundCheck(ref A, secondPos, second));
int surrAfter = surroundCheck(ref A, firstPos, !first) ; // - surroundCheck(ref A, secondPos, !second));

if (surrAfter < surrBefore) //switch spin states if lower total energy
{
A.latticeArray[firstPos.x, firstPos.y, firstPos.z] = !first;
A.latticeArray[secondPos.x, secondPos.y, secondPos.z] = !second;
return true;
}
else if ((surrAfter == surrBefore) & latticeDistribution(ref rr)) //TEMPORARY
{
A.latticeArray[firstPos.x, firstPos.y, firstPos.z] = !first; //TEMPORARY
A.latticeArray[secondPos.x, secondPos.y, secondPos.z] = !second; //TEMPORARY
return true;
}
else
return false;
} //FIX SWITCH PROBABILITIES

在此,lattice 类应该表示包含其属性的“数组”。示例解决方案代码将非常感谢,因为我对 c# 方法缺乏经验。

最佳答案

如果您的操作范围限定为不相交的元素范围(如 1-10、25-40、100-123),您可以在单独的范围上运行操作,而不是为单个元素并行运行。如果您在操作进行时不重新分配数组,则不需要任何其他同步。

如果您的操作更改随机元素,则您必须进行适当的同步,并且可能无法获得在多线程上运行代码的任何好处。

关于c# - 如何对同一数组中的随机位置执行多线程操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21442780/

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