簡體   English   中英

C#並發:在不同的對象屬性上編寫

[英]C# Concurrency: Writing on different object properties

我有以下情況:我有一個C#詞典,它有一個int作為鍵(唯一ID)和一個自定義類作為值,例如Dictionary<int, CustomClass> (這不是ConcurrentDictionary )。 如果我產生了多個線程,這些線程都在整個字典中的不同類屬性上設置了數據,那么它是否線程安全/是否存在競爭條件? 在線程設置數據之前,已經完成了對字典的所有添加操作。

用代碼更新(以清除一些內容):

class Foo {
    public string Prop1 { get; set; }
    public string Prop2 { get; set; }
    public string Prop3 { get; set; }
}

// Initialized with 100 entries - Keys: 0 to 99
Dictionary<int, Foo> dict = new Dictionary<int, Foo>();

List<Task> tasks = new List<Task>();

tasks.Add(Task.Factory.StartNew(() => {
    for(int i = 0; i < dict.Count; i++) {
        dict[i].Prop1 = "whatever";
    }
}));

tasks.Add(Task.Factory.StartNew(() => {
    for(int i = 0; i < dict.Count; i++) {
        dict[i].Prop2 = "whatever";
    }
}));

tasks.Add(Task.Factory.StartNew(() => {
    for(int i = 0; i < dict.Count; i++) {
        dict[i].Prop3 = "whatever";
    }
}));

Task.WaitAll(tasks.ToArray());

當對同一資源的2個或更多代碼塊訪問其資源時,會發生競爭狀態,並且改變自身和/或這些塊的行為取決於塊主題本身的特定執行順序。

因此,如果您的線程之間在相同資源上的執行之間沒有任何依賴關系,那么您可以忽略它們是否同時訪問它。

雖然重要的是,每個屬性都必須對其訪問的屬性進行“可見”更改,並且屬性之間的值之間存在某些依賴關系,例如,一個屬性在分配后會影響另一個屬性的值,然后,您必須同步對該屬性的訪問。

如果不同的線程正在編輯同一對象的不同屬性,則是安全的。 如果您嘗試從多個線程中編輯同一對象上的相同屬性,則將出現競爭狀況。

這是假設屬性未引用共享狀態,這是您的代碼示例所顯示的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM