2011-08-11 158 views
1

這段代碼可以拋出異常嗎?這是線程安全的代碼?

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]>

+0

數據定義在哪裏? – sternr

+0

什麼是上下文? – ChrisF

+0

你的哪些對象可以從不同的線程訪問? – Vlad

回答

2

如果Data能從另一個線程改變,你有問題。例如,如果Data的大小在迭代期間可能會更改,則可能會得到IndexOutOfBoundException。此外,Data可能不支持同時讀寫。 (寫代碼的同時可以用其他線程完成,你用你提供的代碼閱讀。)

你應該用互斥體保護Data

如果我們知道什麼數據類型是Data,我們可以給你更多的信息。


MSDNList<T>不支持併發讀者和作家。所以你必須保護Data,如果其他代碼可以寫入它。

+0

我更新了我的帖子 – Mediator

+0

我也更新了我的答案 – Vlad

0

它是線程安全的,只要你進入陣只爲只讀操作(您不能修改陣列添加/更改項目)

1

線程安全是關於共享資源。 在您提供的代碼片段中,唯一可能的共享資源是Data 如果數據可以從一個以上的線程訪問,並且在其維度可以更改的情況下比沒有 - 您的代碼不是線程安全的。否則 - 這是

0

這取決於你是否要複製陣列中的一個步驟或沒有,所以在這種情況下,當其他線程Data移除項可能存在問題,因此緩存循環限制array.Length值將是錯誤的,這可能會導致IndexOutOfBoundException開始Data[i][0]

0

鑑於您提供的詳細信息,沒有此代碼不是線程安全的,是的它可以拋出異常。你的數據變量在這裏是未知的關鍵,如果其他線程有權訪問它,那麼你可以通過這種方法產生各種各樣的意外行爲。