2017-08-12 49 views
0

只能在單元初始化中添加通用列表或字典中的項目,然後將其作爲只讀用於多個線程嗎?像TDictionary <T>和TList <T>的Delphi只讀泛型是線程安全的嗎?

我讀了一個主題TList<T>是線程安全的,而在TDictionary<T>不是另一個主題。兩者有什麼區別?

+0

您是否認爲該問題? https://stackoverflow.com/questions/27517063/delphi-is-tdictionary-thread-safe –

+0

非常感謝您的迴應。我看到是的,但是我的問題是,如果我初始化某些單元的「初始化」中的字典項目並僅將它用於在多個線程中讀取是安全的。 –

回答

3

閱讀是安全的,寫作是沒有的。只要您可以確保在任何線程訪問它之前填充TList/TDictionary,並且您只是檢索項目,則絕不會添加/修改項目,那麼它是安全的。但是,最好不要依賴那種行爲。您應該始終明確地同意跨線程訪問共享資源,例如TCriticalSection,TMutex,TMREWSync(或Win32 SRW鎖),TMonitor等。

+1

如果性能很重要,那麼你想避免鎖定。所以最好依靠只讀線程安全。 –

+0

非常感謝! –

+0

@David,並不是說它們中的任何一個都是線程安全的,只能讀取。這是內部實施。你可以閱讀來源並說出來。但有一天,EMBT改變了實現,你會感到驚訝。 – Victoria