C 中Finally的乙個不太常見的用法

2022-02-09 14:21:12 字數 784 閱讀 9785

最近在看.net bcl 傳送門 的原始碼. 在

中看到一段有意思的**.注意這段**是寫在concurrentqueue這個用於併發中的佇列. 注意,這是乙個無鎖佇列的實現.

try

finally

if (newhigh == segment_size - 1)

}

有意思嗎?**中使用了乙個空的try**塊.然後把**全都寫在了finally塊.這麼做的目地何在呢?

這其實是乙個小的技巧:放在finally中的**可以防止執行執行緒在執行過程中被另乙個執行緒用呼叫了thread.abort()或thread. interrupt()打斷.從而保證這段**執行的完整性.

舉個例子: 如果不將上面**放到finally中執行.假如正好有乙個執行緒a執行到m_array[newhigh] = value;而另外乙個執行緒b呼叫了執行緒a的thread.abort()那麼m_array[newhigh] = value;以後的**可能沒有機會得到執行.那麼將引起concurrentqueue的不完整.

事實上,這個特性是在.net framework2.0中引入的.在.net 1.1時finally沒有這個作用.另外 tread.abort有可能打斷執行緒內的靜態構構函式執行.

另外我認為同樣的功能也可以用這個thread.begincriticalregionthread.endcriticalregion();來實現.

在finally中呼叫乙個需要await的方法

最近在把code改寫成async await的形式,發現有些情況下需要在finally中需要呼叫非同步方法,但是編譯器不允許在cache和finally 現await關鍵字。但是用wait 或者result又會導致一些其他稀奇古怪的毛病 死鎖啦,aggregateexception啦。所以,需要找乙...

我是乙個不太一樣的研究僧

我是乙個待在公司裡面的研究僧!這大概得從大四開始說起,大四是乙個快要找工作的時期,可我卻沒有.不是因為我學業非常好,而是乙個機會讓我能夠繼續學業上的深造。大四開始沒多久,我認識了我的導師 老狼,老狼是乙個很有想法的老師,幫助學生聯絡導師 給學生鍛鍊機會 創立自己的公司等等等等。我打心眼裡很佩服我的老...

C 裡將windows訊息組成的乙個列舉常量

介紹 net基礎類管理 程式設計師的許多應用程式需要與底層作業系統進行互動的,以實現先進的使用者介面功能,但微軟讓你沒有選擇,只能與視窗的管道進行互動。imessagefilter介面需要使用system.windows.forms.message類,它封裝了windows訊息。不過微軟並沒有把常用...