2010-03-20 142 views
2

這是我面臨的某種異常死鎖嗎?如何避免它?C + + Builder 2010異常死鎖?

看看下面的代碼行,我將TIdContext對象存儲在一個objlist中,有時我需要處理它。但是,如果一個用戶斷開連接,而另一個線程正在處理列表,那麼爲了釋放TIdContext-> Data對象,我得到了Access voilation,好吧,它很好,我正在使用try/catch,但問題是,在下面的行有某種死鎖和進程掛起,如果我附加一個debuger它顯示訪問voilation再次,再次和cpu coonsumption由於異常死鎖上升。

AnsiString UserID = ((Tmyobject*) ((TIdContext*) ObjList->Objects[i])->Data)->UserID;

我知道我可以訪問對象前檢查,如果對象是不爲空,它的工作原理。但我的問題是什麼,如果一旦在一個藍色的月亮數據對象是在點時釋放NULL檢查執行,並在下一行時,當我再次訪問該對象我得到相同的死鎖?

那麼如何避免/處理這個死鎖異常呢?

這裏是調用堆棧...

:005F07C0 System::AnsiStringBase::AnsiStringBase(this=:0285FCE0, src=????) 
:0040223F System::AnsiStringT<0>::AnsiStringT<0>(this=:0285FCE0, src=:00000008) 
:00457996 TSomeClass::SomeFunction(this=:009D8230, UserID={ }, DataSize={ },) 
:0047BFF1 __linkproc__ ThreadProc(Thread=:009561C0) 
:004AD00E __linkproc__ ThreadWrapper(Parameter=:009EAA30) 
:7c80b729 ; C:\WINDOWS\system32\kernel32.dll 

請helppppppppppppppppppppp

感謝

+1

C++ Builder是邪惡的!對不起,我只是說:]。 – pajton 2010-03-21 00:06:22

+1

順便說一句,try/catch's用於捕獲C++異常,而不是訪問衝突。 – 2010-03-21 11:52:39

回答

2

不要使用try/catch來處理訪問衝突。這些不是Java NullPointerExceptions,try/catch無法解決它們造成的破壞。改正底層錯誤。

A deadlock是當兩個或更多線程永久卡住,等待另一個人做某事。你有什麼是race condition:一個線程正在更新對象列表,而另一個正在嘗試使用它,並且如果第一個線程完成得太快,它可能會無意中破壞第二個線程。

處理競爭條件的標準方法是在使用爭用資源的所有代碼周圍放置某種鎖,以便線程有條不紊地使用它,而不是彼此競爭。閱讀互斥體:它們是一個簡單的同步原語,但可能足以解決您的問題。

1

TIdTCPServer的Contexts屬性是一個線程安全的TThreadList,因此您應該可以使用LockList/UnlockList來遍歷活動的上下文,而服務器不會在此期間更改它們。如果你維護一個單獨的列表,有幾個選項,但你必須發佈更多的代碼來描述你如何添加到列表中或從列表中刪除。

+0

是的,請使用服務器的內置客戶端列表,不要單獨管理您自己的客戶端列表。在連接/斷開連接期間,它們可能很容易失去同步。 – 2010-04-14 20:27:00