Передача ссылки на функцию потока без копирования - PullRequest
0 голосов
/ 26 августа 2018

Правильно ли следующее использование потоков:

    FT[] ft = new FT[iota_Delta_tau];
    Thread[] t = new Thread[iota_Delta_tau];
    for (int i = 0; i < iota_Delta_tau; i++)
    {
        int copy_i = i;
        t[i] = new Thread(() => ThreadNewFt(ref ft[i], copy_i));
        t[i].Start();
    }
    for (int i = 0; i < iota_Delta_tau; i++)
        t[i].Join();

Я использую copy_i вместо i, потому что он используется в лямбда-выражении для нового потока. Но я беспокоюсь о ref ft[i]. Я не могу отправить копию этого, потому что это ссылка. Я волнуюсь так же, как это происходит: MutiThreading - Индекс находился за пределами массива. Исключение

1 Ответ

0 голосов
/ 26 августа 2018

Копия необходима только в том случае, если вы хотите указать новое значение на каждой итерации, что неверно для ft Я полагаю.Единственное, что нужно исправить - это ref ft[copy_i] вместо ref ft[i].Однако использование TPL было бы более эффективным и аккуратным вариантом:

        Parallel.For(0, iota_Delta_tau, i => ThreadNewFt(ref ft[i], i));

вместо всего кода, приведенного выше.

...