我是執行緒的新手。我有一個串列和 2 個執行緒 T1 和 T2。
private readonly List<item> myCompletedItems;
我有一個設定集合的方法
public void ItemCreated(item theitem)
{
this.myCompletedItems.add(theitem);
}
我有另一種方法可以獲取第一項的欄位值:
public int GetStartItemId()
{
return this.myCompletedItems[0].id;
}
執行緒 1 正在向“myCompletedItems”添加專案。但即使在將專案添加到串列之前,執行緒 2 也會嘗試訪問串列并拋出“System.ArgumentOutOfRangeException:索引超出范圍”。我如何讓執行緒 2 等待所有專案都被執行緒 1 添加到串列中?
uj5u.com熱心網友回復:
常規串列不是執行緒安全的,當嘗試從多個執行緒同時使用它時,幾乎任何事情都可能發生。
我如何讓執行緒 2 等待所有專案都被執行緒 1 添加到串列中?
如果要確保兩個執行緒不會同時訪問資源,請使用鎖,或者使用manualResetEvent/autoResetEvent來阻塞執行緒,直到另一個執行緒執行某些操作。
或者更實際地,使用并發集合。
然而,多執行緒并不是一個隨意胡亂嘗試的好地方。這很容易導致很難重現的錯誤。即使對于有經驗的程式員來說,多執行緒也很困難,在嘗試使用多執行緒之前,您應該對死鎖和競爭條件 等潛在危險有相當深入的了解。另請參閱異步編程和DataFlow,這些部分是為了避免執行緒之間手動同步的需要。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/325552.html
