2010-05-11 114 views
1

父進程和子進程會死鎖如果父進程正在使用資源,子進程也會得到相同的資源?如果父母包含兩個線程呢?孩子也會得到2個線程嗎?叉如何可以線程安全?有關線程和死鎖的一些問題

+1

這真的很難說。你爲什麼不試試問一個非常具體的問題和一個資源,以及一個共享場景?一些資源可以共享;有些不能。有些可以通過某些方式共享,但不是其他方式。例如,通常可以讀取內存,但不能在沒有某種同步的情況下同時寫入內存,而操作系統會爲您仲裁CPU。 – WhirlWind 2010-05-11 01:53:44

+0

另外,如果您認爲自己已經收到了有關您問題的寶貴答案,那麼您可能希望接受優秀的答案,以獎勵那些努力幫助您的人。 – WhirlWind 2010-05-11 01:54:39

回答

2

的一個句子描述從Wikipedia

死鎖是一種情況,其中兩個或更多個相互競爭的操作分別等待對方完成,並且因此既不以往一樣。

最簡單的情況是兩個線程和兩個資源。

線程A:

acquireResource(r1) 
    acquireResource(r2) 
    // Do stuff 
    releaseResource(r1) 
    releaseResource(r2) 

線程B:如果發生以下事件序列

acquireResrouce(r2) 
    acquireResource(r1) 
    // Do stuff 
    releaseResource(r1) 
    releaseResource(r2) 

有了這個代碼發生死鎖。

  1. 線程A獲得R1
  2. 上下文切換到線程B
  3. 線程B獲得R2

此時線程A無法繼續,因爲它是R2已經擁有和線程B能不會繼續,因爲r1是擁有的。因此,這兩個線程都不能繼續發佈資源。這是一個僵局。

通過確保在整個代碼中以相同的順序獲取資源,可以避免像這樣簡單的情況。例如,如果線程B首先獲取r1,則不會出現死鎖。有很多其他方法可以實現僵局,儘管這些方法難以避免。