这是线程安全的代码?

时间:2011-08-11 11:01:47

标签: c# .net multithreading thread-safety

此代码可以抛出异常吗?

public String[] GetPorts()
        {
       var sourceArray = Data;
        var array = new String[sourceArray.Count];
        for (int i = 0; i < array.Length; i++)
        {
            array[i] = Data[i][0];
        }
        return array;
}

数据为List<String[3]>

5 个答案:

答案 0 :(得分:2)

如果可以从其他线程更改Data,则表示您遇到了问题。例如,如果在迭代期间可能会更改Data的大小,则可能会获得IndexOutOfBoundException。此外,Data可能不支持同时阅读和写作。 (写作可以在你用你提供的代码阅读的同时由其他线程完成。)

您应该使用互斥锁保护Data

如果我们知道哪种数据类型为Data,我们可以为您提供更多信息。


根据MSDNList<T>不支持并发读者和作者。因此,如果其他代码可能会写入Data,则必须保护{。}}。

答案 1 :(得分:1)

线程安全就是共享资源。 在您提供的代码段中,唯一可能的共享资源是Data 如果可以从一个线程访问数据,并且如果其中的维度可以更改,则不是 - 您的代码不是线程安全的。否则 - 它是

答案 2 :(得分:0)

只要您只为只读操作访问数组(您无法修改添加/更改项目的数组),它是线程安全的

答案 3 :(得分:0)

这取决于您是否要在一个步骤中复制数组,因此在这种情况下,当另一个线程从Data中删除项时可能会出现问题,因此缓存的循环限制array.Length值将是错的,这可能导致IndexOutOfBoundException Data[i][0]

答案 4 :(得分:0)

鉴于您提供的详细信息,此代码不是线程安全的,是的,它可以抛出异常。您的Data变量是一个未知的密钥,如果其他线程可以访问它,那么您可以使用此方法获得各种意外行为。