2013-10-23 186 views
0

如果有以下情形:退出螺紋

  1. Thread0運行代碼調用其他組件。
  2. Component0被調用Thread0並觸發一個事件。
  3. 事件處理程序試圖通過設置一個停止標記來停止thread0
  4. 現在我通常會加入Thread0等待,直到清理完所有東西並完成。但如果我這樣做,我會造成僵局。因此,讓我們說,我只是設置標誌退出完成Thread0爲真,並返回到Component0事件的事件處理程序。
  5. Eventhandler的下一行嘗試處理Thread0正在使用的資源。請記住:Thread0仍在運行,因爲我無法等待它,因爲嘗試停止Thread0的事件處理程序在Thread0的上下文中執行。
  6. 現在事件處理程序已完成,並且Thread0嘗試使用以前處置的資源>,這會導致未知行爲。

目前我在處理所有組件之後立即要求標記,無論它是否處置完畢。如果它被處置了,我打破了退出線程。

是否有更好的模式來處理這種複雜的行爲。

+1

爲什麼不僅僅處理Thread0在主循環結束時使用的資源(在標誌已被發現以指示線程應該停止之後)? –

+0

我不明白你的流程..它寫得不好,但如果你有成員國旗,考慮將其標記爲易變。 – ilansch

+0

我不完全清楚你在做什麼,但在我看來,放棄一個線程最簡潔的方法是拋出一個異常,讓它冒泡到它應該被記錄的外部範圍或任何合適的地方。 –

回答

1

的事件處理程序的下一行試圖處置資源Thread0使用

這是你的問題就在這裏。您試圖從外部範圍釋放資源,這通常會導致麻煩。

您是否有限制,不允許您確定性地釋放thread0在其執行結束時使用的資源?如果是這樣,請張貼更多解釋。也許一個簡化的代碼示例。

此外,線程和事件處理程序的區別在這裏不合適。從你的描述中,我明白事件處理程序的代碼在thread0上執行。所以你應該談論2個或更多的組件,當它們在某個時刻一個接一個地執行時,其中一個組件會在同一個線程上執行一些在其之後運行的組件。

+0

問題是我的代碼是庫的一部分。所以我不知道用戶會如何處理圖書館。 –

+0

@thefiloe,我不明白。 – Vitaliy