2013-03-14 51 views
1

假設我需要清理終結器中的一些託管資源,或者至少以線程安全的方式將其記錄在需要清理的地方。根據我的理解,鎖定終結者是嚴格禁止的,但Interlocked類怎麼樣?這是否安全,是否會導致僵局?可以在終結器中使用互鎖嗎?

static int deadentries; 
~Item() { Interlocked.Increment(ref deadentries); } 
public static T Get(int id, Action<T> init) { 
    T ret; 
    WeakReference<T> tref; 
    if (cache.TryGetValue(id, out tref)) { 
     if (tref.TryGetTarget(out ret)) return ret; 
     else Interlocked.Decrement(ref deadentries); 
    } 
    if (deadentries * 2 > cache.Count) { 
     // etc. etc. 

而且,似乎一切都終結在一個線程中運行,這是有保證的行爲,或只是實現的細節?如果只是一個細節,這是否可以在終結器內部獲取鎖(比如,將任務推入一個無鎖隊列中),前提是鎖永遠不會在其他地方使用?

回答

1

正在運行一個線程的終結器是一個實現細節(它不可能永遠不會改變,因爲它違反了微軟支持的非常嚴格的兼容性標準,依然不行)。

鎖定在終結器中確實沒問題。它們可能會成爲性能或正確性問題,但這不是由於它們作爲終結器的一部分運行所致。這些是鎖的一般屬性。 Interlocked類也可以使用。

請記住,終結器可以按任何順序執行並可能同時執行。也不是逆向依賴順序,而是隨機順序。

相關問題