我通過並行編程舉例關於種族問題的條件下工作並行編程競爭條件
在這個例子中,他們都表現出了隔離圖案應對競爭條件
爲什麼在這個例子以下是比賽條件不會發生在創建任務時,並且stateObject作爲任務創建的一部分傳遞
我知道我們使用isolatedBalance進行更新......但在我們分配isolatedbalance = (int)stateObject
時無法完成其他任務平衡在那裏,即不是0但100
所以,如果有足夠的任務,並且任務調度程序開始了一個早期任務,並且它完成了一個點,當一個稍後的任務被創建並且分配賬戶時。當任務中的一個具有時, finshed的TAKS這是開始
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.WaitAll(任務)作爲所有任務被分配account.Balance按值,因爲所有任務強制完成組織結餘將始終爲0時分配account.balance :-) – HoopSnake