2009-06-05 44 views
1

現在我面臨移植作業中的一個問題,當我需要實現一個線程類時,它不僅可以在wince,symbian中工作,而且還可以像iphone一樣使用類Unix系統。如何恢復/暫停iphone OS中的pthread?

我擁有一個掛起/恢復界面來實現,除了iPhone之外,wince/symbian中的任何東西都可以使用,我使用posix pthread來完成我的工作,但是我搜索整個docset用於恢復/掛起界面。事情似乎很困難,並行線程在iphone擁有pthread_create_suspended_np,可以創建掛起模式的線程。現在如何在任何時候線程運行之後恢復或暫停線程。

順便說一句,我搜索谷歌的一些幫助,似乎別人也有這個問題。 一些人建議使用SIGHUP信號,但是這將暫停的全過程,這是絕對不正常。

非常感謝,如果你們可以告訴我一些解決這個問題的方法。

回答

2

從外部嘗試和控制線程實際上是一個壞主意。你永遠不知道他們暫停時可能處於什麼狀態。如果他們在其他地方需要的資源上有互斥鎖,則可能會很容易導致死鎖情況。

我們必須不訴諸任何非便攜式並行線程擴展的同時,前創造一個「安全」的暫停功能,我會盡量記得我們是怎麼做的。

它由每個線程的懸掛互斥和一個表示線程狀態的變量組成。所以我們希望暫停將有一個循環(他們主要是做)的線程去是這樣的:

while true: 
    set mystate = suspended 
    claim mymutex 
    yield 
    release mymutex 
    set mystate = running 
    do some work 

和暫停/恢復代碼的線程將是:

function suspend (state,mutex): 
    claim mutex 
    while state <> suspended: 
     yield 
function resume (state,mutex): 
    release mutex 
    while state <> running: 
     yield 

什麼掛起程序會做的基本上是鎖定互斥鎖並等待線程進入掛起狀態(mystate的寫入只能由掛載程序完成,而不必由另一個互斥鎖保護)。在保證暫停將被停止之前,suspend函數不會返回。

同樣,恢復線程釋放互斥體,因此suspendee可以重新啓動,然後等待,直到它在返回之前重新啓動。

這允許懸掛發生,但在被掛起的線程的控制下。這樣做比較安全,因爲它可以確保只有在沒有任何可能會導致應用程序死鎖的鎖定時才能在安全的地方暫停。

0

,暫停和恢復正在運行的線程,我相信你需要使用pthread_cond_wait。基本上,它暫停調用線程,直到條件變量變爲true。當然,你還需要給每個線程一個找出何時調用該函數的方法。

0

你給我一個線索來解決這個問題,但這種方法或調用pthread_cond_wait只是等待/葛當設計某種情況。如何在不知道更多信息的情況下暫停特殊線程。關於線程,我們只擁有一個線程ID,我們暫停它在另一個線程中,當我們想要恢復暫停的線程時,我們可能只是在任何地方運行resume函數。我們可以做這樣的事嗎?或任何其他想法?

關於。

+0

如果你有函數掛起線程(pthread_suspend或pthread_suspend_np在某些實現中,但不是Linux,我相信),那麼是的,你可以。你只需要意識到後果。我不知道iPhone是否具備這種能力,我只知道即使是這樣,我也不會使用它。 – paxdiablo 2009-06-08 06:43:21