Некорректно работают потоки - C#
Формулировка задачи:
В общем мне нужно сделать задание - рассчитать детерминант матрицы. Пользуюсь стандартным алгоритмом.
Решил распаралеллить вычисления, так как матрица 13 на 13 считается около часа. Разбил матрицу на матрицы поменьше (скажем, матрицу 13 на 13, на 13 матриц по 12 на 12) и забил их в лист, а потом для каждого элемента листа запускаю поток, который считает определитель. В итоге у меня должен остаться лист ListOfDets, в котором находятся искомые детерминанты. В итоге забивается лист только для матриц до 10 на 10, а если исходная матрица больше, то ListOfDets остается пустой! В чем причина такого странного поведения?
Код в мэйне
static List<List<List<int>>> ListOfArrays = new List<List<List<int>>>(); private static List<int> ListOfDets = new List<int>(); for (int i = 0; i < ListOfArrays.Count; i++) { ThreadsCount++; ThreadPool.QueueUserWorkItem(Adder, ListOfArrays[i]); ThreadPool.SetMinThreads(2000, 2000); }
private static void Adder(object matrix) { List<List<int>> resmatrix = (List<List<int>>) matrix; int result = DetAlgorithm(resmatrix); // lock (_LOCK) //{ ListOfDets.Add(result); // } } protected static int DetAlgorithm(List<List<int>> matrix) { int detTemp = 0; int sign = 1; int matrixLength = matrix[0].Count; if (matrixLength == 2) { return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0]; } for (int j = 0; j < matrixLength; j++) // количество элементов в каждом листе { List<List<int>> temp = new List<List<int>>(matrixLength - 1); for (int i = 0; i < matrixLength; i++) { temp.Add(new List<int>()); temp[i].AddRange(matrix[i]); temp[i].RemoveAt(j); } temp.RemoveAt(0); detTemp += sign * matrix[0][j] * DetAlgorithm(temp); sign = -sign; } return detTemp; }
Решение задачи: «Некорректно работают потоки»
textual
Листинг программы
private static void Adder(object matrix) { List<List<int>> resmatrix = (List<List<int>>)matrix; int result = DetAlgorithm(resmatrix); lock (ListOfDets) ListOfDets.Add(result); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д