Совмещение lock и параллельного прохода данного блока

223
03 ноября 2017, 08:17

Есть цикл, в котором рассчитываются данные. В каждом новом проходе создается объект с входными параметрами и после расчета эти входных параметров выдается конечное число - результат. Т.к. итерации не зависят друг от друга, через AsParallel я добавил параллельное выполнение данного цикла. Но, у меня каждый поток пересекается с другим. Окей. Я добавил в функции расчета lock. Но тут появилась проблема, что расчеты не будут вестись параллельно, потому что к новому расчету нельзя будет приступить, пока предыдущий поток не закончится. И задача в том, чтобы сделать проход по циклу параллельным, но, чтобы каждый поток никак не залезал в данные другого потока. Как можно решить такую задачу? Например :

public class A
{
    public int g;
    public int c;
    public A(int gC, int cC)
    {
        g = gC;
        c = cC;
    }
}

public class C
{
    public C()
    {
    }
    public double Result()
    {
        double g = 0;
        for(int i = 0; i < 100; i++)
        {
            for(int j = 0; j < 100; j++)
            {
                double resCalc = Calculation(i, j);
                if (resCalc > g)
                    g = resCalc;
            }
        }
        return g;
    }
    public double Calculation(int Ag, int Ac)
    {
        A a = new A(Ag, Ac);
        return a.c + a.g;
    }
}

Пример написан на скорую руку, но результат примерно такой. Здесь мы в классе C создаем объект класса A с данными параметрами цикла, и считаем сумму параметров. Т.к. каждая итерация не зависит от предыдущей, мы можем это сделать параллельным, но тогда потоки будут пересекаться. Нужно, чтобы каждый поток создавал объект класса A и работал именно с ним и возвращал значение именно своё. Если я добавляю lock, то у меня убирается многопоточность цикла, потому что расчет идет последовательно.

READ ALSO
Реализация коллекций через ConsoleApp

Реализация коллекций через ConsoleApp

Исходные данные: Примитивное консольное приложение, допустим по выбору президента на выборахПосле запуска приложения пользователь должен...

236
Xamarin не работает после установки

Xamarin не работает после установки

Установил Xamarin в VS 2017Создаю проект Cross Platform App > Пустое приложение > Xamarin

223
Drag &amp; Drop из проводника в TreeView

Drag & Drop из проводника в TreeView

Есть иерархическая структура TreeView с TreeViewItem, для каждого TreeViewItem нужно разрешить перетаскивание файла из проводника и сохранять ссылку на этот...

351
Как повторить структуру папки?

Как повторить структуру папки?

Есть папка и ее полный путь "С:\Temp"В данной папке есть вложенные папки и уровень вложений не известен

236