如何在这段代码上实现多线程 - 如果可能的话?

时间:2012-06-19 20:45:25

标签: c# multithreading

我正在用C#构建一个有限元分析库。在我要分析的每个结构中,需要在元素级别上执行多个计算并将结果一起放在结构级别上。当有许多元素时,所有这些计算都会引起很大的反响。

例如,计算元素刚度矩阵并将其组装到全局刚度矩阵中。

有没有办法让这个过程利用线程?

public class FEStructure
{
    public List<Element> elements = new List<Element>;
    public Matrix K;

    Struct()
    {
        // Do some stuff not relevant here
    }

    public void CalcK()
    {
        // Create a Global stiffness matrix (n x n)
        K = new DenseMatrix(SizeK());

        // Process all elements - can it be threaded?
        foreach (Element e in elements)
        {
            // Get the element stiffness matrix  and assemble it into K
            Matrix Ke = e.CalcKe();
            Assemble(Ke);
        }
    }

    public void Assemble(Matrix Ke)
    {
        // Assembles Ke into K using the element topology
        // and lot of fields and methods left out. Code
        // operates on K using syntax similar to:
        K[i, j] = Ke[k, l];
    }
}

修改

通过e.CalcKe()计算元素矩阵是一个独立的计算,可以按任何顺序执行。

2 个答案:

答案 0 :(得分:2)

你应该能够使用Parallel.ForEach轻松地为线程上的每个循环进行parellize。

您只需要确保矩阵中的赋值是线程安全的,并且单个计算不依赖于按顺序完成。

答案 1 :(得分:0)

Parallel.ForEach(elements, e =>
{
     var eResult = e.CalcKe(); 
     AggregateResults(eResult);
}

void AggregateResults(Matix r)
{
    lock(denseMatrix)
        denseMatix[a,b] = r[k,l];
}