gpt4 book ai didi

c# - 并行编程竞赛条件

转载 作者:行者123 更新时间:2023-12-03 12:49:50 26 4
gpt4 key购买 nike

我正在研究有关竞赛条件的并行编程示例

在该示例中,他们演示了隔离模式以处理竞争条件

为什么在此示例中,为什么在创建任务时未出现竞争条件,并且在创建任务时传递了stateObject

我知道我们使用isolatedBalance来进行更新...但是在我们分配isolatedbalance = (int)stateObject的那一刻,不可能再有其他任务完成余额了,即不是0而是100 ???

因此,如果有足够的任务并且任务计划程序开始了早期任务,并在创建后续任务并分配帐户的某个时间点完成,则当其中一项任务完成任务时,余额值为100,以此类推那开始了

class BankAccount
{
public int Balance { get; set; }
}

class Program
{
static void Main(string[] args)
{

var account = new BankAccount();
var tasks = new Task<int>[1000];


for (int i = 0; i < 1000; i++)
{
tasks[i] = new Task<int>((stateObject)=>
{
int isobalance = (int) stateObject;
for (int j = 0; j < 1000; j++)
{
isobalance ++;
}
return isobalance;
}, account.Balance);

tasks[i].Start();
}
Task.WaitAll(tasks);

for (int i = 0; i < 1000; i++)
{
account.Balance += tasks[i].Result;
}

Console.WriteLine("Epectecd valeu {0}, Counter value {1}",1000000,account.Balance);

// wait for input before exiting
Console.WriteLine("Press enter to finish");
Console.ReadLine();
}
}

最佳答案

您传递给Task构造函数的方法不会更新account.Balance,它仅使用account.Balance的初始值。它不会更新它。 int是按值传递的。从MSDN:

值类型变量直接包含其数据,而引用类型变量则包含对其数据的引用。因此,将值类型变量传递给方法意味着将变量的副本传递给方法。方法内部对参数所做的任何更改都不会影响存储在变量中的原始数据。如果要被调用的方法更改参数的值,则必须使用ref或out关键字通过引用传递它。为简单起见,以下示例使用ref。

因此,直到调用account.Balance后,才会更新Task.WaitAll(tasks);Task.WaitAll()使代码在所有任务完成之前在此处停止。只有在那之后,所有的结果都被计算出来。会使用account.Balance返回的值更新tasks[i].Result

关于c# - 并行编程竞赛条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8382401/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com