自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何判斷代碼是否處于臨界區(qū)

新聞
有這么個(gè)問題,有個(gè)讀者問:當(dāng)異常發(fā)生的時(shí)候,如果不知道是否要清理臨界區(qū)對(duì)象,什么是合適的異常處理方式?

有這么個(gè)問題

有個(gè)讀者問:當(dāng)異常發(fā)生的時(shí)候,如果不知道是否要清理臨界區(qū)對(duì)象,什么是合適的異常處理方式?

[[340966]]

這個(gè)讀者的問題是這樣的:

  • “我正在使用SEH,在代碼中我使用了__try/__except塊來保護(hù)那些進(jìn)入和退出臨界區(qū)的代碼。當(dāng)異常發(fā)生的時(shí)候,我不知道我是否還在臨界區(qū)中還是已經(jīng)出來了。就算是使用__try/__finally這種方式,也沒能解決我的

問題。”

問題答案:你可以知道你是否擁有臨界區(qū)對(duì)象,因?yàn)槟阋坏┻M(jìn)入了,就表示你獲取到了臨界區(qū)對(duì)象。

方法1:通過指令指針進(jìn)行判斷

“如果代碼執(zhí)行到這里,則表示我肯定在臨界區(qū)里。”

 

如何判斷代碼是否處于臨界區(qū)

請(qǐng)注意,以上這種方法對(duì)于嵌套調(diào)用EnterCriticalSection的情況也是能正常工作的。

如果你再次獲取到了臨界區(qū),則一定要記得將調(diào)用包含在它自身的try/finally結(jié)構(gòu)中。

方法2:通過棧變量進(jìn)行判斷

“我記得我是否已經(jīng)進(jìn)入臨界區(qū)”

 

如何判斷代碼是否處于臨界區(qū)

以上方法也是可以適用于嵌套調(diào)用EnterCriticalSection的情況。只是要記得,每次獲取臨界區(qū)對(duì)象,都要對(duì)cEntered進(jìn)行加1。

方法3:通過對(duì)象來進(jìn)行追蹤

將CRITICAL_SECTION封裝到一個(gè)對(duì)象中。

這種方法最適合上面那位讀者的情況。

 

如何判斷代碼是否處于臨界區(qū)

請(qǐng)注意,上面的代碼,不適用于嵌套臨界區(qū)的情況。如果你試著獲取臨界區(qū)對(duì)象兩次,則異常處理器只會(huì)退出臨界區(qū)一次。

還請(qǐng)注意,我們認(rèn)為臨界區(qū)在初始狀態(tài)下為未獲取狀態(tài)并添加了斷言。如果恰好已經(jīng)獲得了臨界區(qū),則我們的清理代碼將會(huì)嘗試退出臨界區(qū),但是它實(shí)際并沒有進(jìn)入。(試想一下,如果在第一個(gè)”…”中就出現(xiàn)了異常。)

方法4:通過智能對(duì)象判斷

通過將CRITICAL_SECTION對(duì)象封裝到一個(gè)智能對(duì)象中。

可以在上面的代碼中添加如下方法:DWORD Depth() { return Owned() ? m_dwDepth : 0; }

代碼如下:

 

如何判斷代碼是否處于臨界區(qū)

當(dāng)異常發(fā)生在臨界區(qū)的時(shí)候進(jìn)行清理會(huì)導(dǎo)致這樣一個(gè)問題:我怎么知道清理操作是安全的?

你使用到了臨界區(qū)說明你想獨(dú)占的使用一個(gè)數(shù)據(jù)結(jié)構(gòu),但是如果在獲取臨界區(qū)的時(shí)候發(fā)現(xiàn)了異常,此時(shí)數(shù)據(jù)結(jié)構(gòu)的狀態(tài)是不穩(wěn)定的。如果只是簡(jiǎn)單的退出臨界區(qū)會(huì)導(dǎo)致數(shù)據(jù)結(jié)構(gòu)進(jìn)入到一個(gè)不一致的狀態(tài),就會(huì)導(dǎo)致一個(gè)很難診斷的問題:為什么我的引用計(jì)數(shù)沒有同步了?

后面我還會(huì)有更多關(guān)于異常的內(nèi)容。

最后

Raymond Chen的《The Old New Thing》是我非常喜歡的博客之一,里面有很多關(guān)于Windows的小知識(shí),對(duì)于廣大Windows平臺(tái)開發(fā)者來說,確實(shí)十分有幫助。

 

責(zé)任編輯:未麗燕 來源: 今日頭條
相關(guān)推薦

2012-02-29 15:35:45

2018-07-12 05:48:09

物聯(lián)網(wǎng)IOT智能技術(shù)

2013-12-06 10:20:21

2021-03-02 14:44:40

比特幣花旗集團(tuán)金融機(jī)構(gòu)

2011-05-25 10:46:39

Javascript

2020-10-16 08:09:58

算法代碼字符串

2018-11-06 10:31:36

互聯(lián)網(wǎng)數(shù)據(jù)計(jì)算機(jī)

2020-10-22 08:06:05

JavaScrip語(yǔ)言類型

2016-05-24 10:30:56

網(wǎng)站設(shè)計(jì)出色

2011-12-01 11:06:30

軟件定義網(wǎng)絡(luò)

2011-08-09 16:58:33

windows7Windows7是否被

2020-10-22 14:00:31

JavaScript數(shù)字變量

2017-12-11 11:00:27

內(nèi)存泄露判斷

2013-01-10 09:47:50

辭職就業(yè)面試

2014-05-13 09:53:24

算法π值

2022-11-02 08:27:30

2013-01-16 09:58:57

無(wú)線網(wǎng)無(wú)線網(wǎng)盜用

2017-12-06 19:00:53

2021-03-22 11:43:07

Linux運(yùn)維Linux系統(tǒng)

2021-02-28 19:30:31

Wi-Fi - 6Wi-Fi網(wǎng)絡(luò)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)