Массив потоков threads (распараллелить кусок кода из алгоритма Дейкстры) - C#
Формулировка задачи:
Пытался распараллелить кусок кода из алгоритма Дейкстры,но почему то ни один поток ничего не выполняет,т.е значения в MyData.unvisitedPoints остаются такие какие были из-за чего,подскажите пожалуйста в чем ошибка.p.s:Сори за быдлокод
static class MyData
{
public static List<point> unvisitedPoints = new List<point>();//список непосещенных вершин
public static point v = new point();//хранит минимальную точку
public static List<Lines> LinesList = new List<Lines>();//список ребер(содержит вес пути)
} private point FindMin(List<point> list)
{
if (list.Count == 0)
{
return null;
}
int min = int.MaxValue;
point minPoint = null;
foreach (var p in list)
{
if (p.metka < min)
{
minPoint = p;
min = p.metka;
}
}
return minPoint; } public double FindPath(List<Lines> LinesList, List<point> PointList, point startPoint)
{
double weight = 0;
//список точек которые не были посещены
MyData.unvisitedPoints = new List<point>(PointList);
foreach (var p in MyData.unvisitedPoints)
{
p.metka = int.MaxValue;//изначально все метки равны условной бесконечности
p.optPath.Clear();
};
startPoint.metka = 0;//обнуляем метку начальной точки
startPoint.optPath.Add(startPoint);
while (MyData.unvisitedPoints.Count != 0)
{
MyData.v = FindMin(MyData.unvisitedPoints);//множество вершин графа
MyData.unvisitedPoints.Remove(MyData.v);
Thread[]threads=new Thread[MyData.unvisitedPoints.Count];
for (int i = 0; i< threads.Length-1;i++ )
{
threads[i] = new Thread(SetMetka);
threads[i].Start(i);
}
}
return weight;
} void SetMetka(object m)
{
int u = (int)m;
//ищем ребро которое соеденяет вершину с мин-й меткой(v) и непосещенную вершину(u)
var E = GetLine(MyData.v, MyData.unvisitedPoints[u], MyData.LinesList);//множество ребер графа
if (E != null && MyData.unvisitedPoints[u].metka > MyData.v.metka + E.weight)//если из мни.вершины есть ребра и метка непосещенной вершины u
// >метки минимальной вершины v+ вес ребра соед-й эти две вершины
{
MyData.unvisitedPoints[u].metka = MyData.v.metka + E.weight;//то метка текущей непосещенной вершины равняется метке минимальной вершины v+ вес ребра соед-й эти две вершины
MyData.unvisitedPoints[u].optPath = new List<point>(MyData.v.optPath);//обновляем список оптимальных путей для непосещенной вершины
MyData.unvisitedPoints[u].optPath.Add(MyData.unvisitedPoints[u]);//добавляем в оптимальный путь текущую непосещенную вершину
}
}Решение задачи: «Массив потоков threads (распараллелить кусок кода из алгоритма Дейкстры)»
textual
Листинг программы
for (int i = 0; i< threads.Length-1;i++ )
{
threads[i].Join();
}