C#并发:写入不同的对象属性

时间:2016-12-28 15:05:46

标签: c# multithreading dictionary

我有以下情况:我有一个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 个答案:

答案 0 :(得分:0)

当两个或更多代码块访问同一资源时,会发生竞争条件,从而改变其状态,并且更改自身和/或这些块的行为取决于块自身的特定执行顺序。

因此,如果您的线程之间没有任何关于它们在同一资源上执行的依赖关系,那么您可以忽略它们是否同时访问它。

如果重要的是每个对它正在访问的属性进行“可见”更改,并且属性之间存在一些关于其值的依赖关系,例如,一个属性在分配时会影响某些属性的值另外,您必须同步对该属性的访问权。

答案 1 :(得分:-2)

如果不同的线程正在编辑同一对象的不同属性,那么它是安全的。如果您尝试从多个线程编辑同一对象上的相同属性,则会出现竞争条件。

这假设属性未引用共享状态,这是您的代码示例所示。