繁体   English   中英

C#线程安全代码

[英]C# Thread safe code

此代码线程安全吗?

使用Task在新线程中调用DoStuff

Task.Factory.StartNew(() => DoStuff());


private void DoStuff()
{
    List<SalesRecord> salesRecords = new List<SalesRecord>();
    SalesRecord salesRecord1 = new SalesRecord {Amount = 10.0, Sales = 1};
    SalesRecord salesRecord2 = new SalesRecord {Amount = 15.0, Sales = 1};
    SalesRecord salesRecord3 = new SalesRecord {Amount = 1.0, Sales = 2};
    salesRecords.Add(salesRecord1);
    salesRecords.Add(salesRecord2);
    salesRecords.Add(salesRecord3);
    SalesRecord result = Util.SumSales(salesRecords);
}

仅用于存储数据的结构:

public struct SalesRecord
{
    public uint Sales;
    public double Amount;
}

东西

public static class Util
{
    public static SalesRecord SumSales(List<SalesRecord> records)
    {
        SalesRecord result = new SalesRecord();

        result.Amount = records.FindAll(record => (record.Sales == 1)).Sum(record => record.Amount);
        result.Sales = 1;
        return result;
    }
}

此代码线程安全吗?

是的。 此代码不使用任何共享状态。 根据定义,不使用任何共享状态的代码是线程安全的。

您可以在任意数量的线程中同时调用DoStuff ,而不会出现任何问题。 也就是说, DoStuff方法不是很有用。

您的代码看起来不错。 即使DoStuff是通过Task启动的,我也看不到代码中处理类变量的任何地方,它们都是局部变量。

参考: C#:如果从多个线程调用静态方法怎么办?

发布给那些试图弄清楚为什么即使使用静态方法也是线程安全的人

在这种特殊情况下,对Util.SumSales(salesRecords)的访问是线程安全的,因为它是线程本地方法(调用此方法的线程将其自身的数据副本提供给该方法,并且该线程中的数据访问对调用它的线程)。

当您调用以下代码时:

Task.Factory.StartNew(() => DoStuff());

您分配一个新线程来处理DoStuff()。 DoStuff中发生的所有事情(除非您引入可以在其外部进行操作的变量)都是该新线程专有的。

我想您会从DoStuff()获得的收益更多。 在这种情况下,您应该将结果存储在Concurrent Collections中

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM