传递对线程函数的引用而不进行复制

时间:2018-08-26 11:49:30

标签: c# lambda thread-safety

下面的线程使用正确吗?

    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,因为它在新线程的lambda表达式中使用。但是我担心ref ft[i]。我不能发送它的副本,因为它是参考。我担心会发生同样的事情: MutiThreading - Index was outside the bounds of the array Exception

1 个答案:

答案 0 :(得分:0)

仅当您想在每次迭代中提供一个新值时才需要该副本,而我认为ft并不适用。唯一要纠正的是ref ft[copy_i]而不是ref ft[i]。但是,使用TPL会更高效,更简洁:

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

而不是上面的所有代码。