[英]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
启动的,我也看不到代码中处理类变量的任何地方,它们都是局部变量。
发布给那些试图弄清楚为什么即使使用静态方法也是线程安全的人
在这种特殊情况下,对Util.SumSales(salesRecords)的访问是线程安全的,因为它是线程本地方法(调用此方法的线程将其自身的数据副本提供给该方法,并且该线程中的数据访问对调用它的线程)。
当您调用以下代码时:
Task.Factory.StartNew(() => DoStuff());
您分配一个新线程来处理DoStuff()。 DoStuff中发生的所有事情(除非您引入可以在其外部进行操作的变量)都是该新线程专有的。
我想您会从DoStuff()获得的收益更多。 在这种情况下,您应该将结果存储在Concurrent Collections中 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.