freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

03講_線程進程安全(編輯修改稿)

2025-01-22 07:20 本頁面
 

【文章內(nèi)容簡介】 的下降,甚至造成死鎖。 線程協(xié)作安全 線程協(xié)作 有些情況下,多個線程合作 完成一件事情的幾個步驟,此時線程之間實現(xiàn)了協(xié)作。如一個工作需要若干個步驟,各個步驟都比較耗時,不能因為它們的運行,影響程序的運行效果,最好的方法就是將各步用線程實現(xiàn)。但是,由于線程隨時都有可能搶占 CPU,可能在前面一個步驟沒有完成時,后面的步驟線程就已經(jīng)運行,該安全隱患造成系統(tǒng)得不到正確結(jié)果。 案例分析 給出一個案例:線程 1負責(zé)完成一個復(fù)雜運算(比較耗時),線程 2負責(zé)得到結(jié)果,并將結(jié)果進行下一步處理。如:某個科學(xué)計算系統(tǒng)中,線程 1負責(zé)計算11000各個數(shù)字的和 (暫且認(rèn)為它非常耗時 ),線程 2負責(zé)得到這個結(jié)果并且寫入數(shù)據(jù)庫。 讀者首先想到的是將耗時的計算放入線程。這是正確的想法。首先用傳統(tǒng)線程方法來編寫這段代碼,代碼如 。 該程序貌似沒有問題,也能夠打印正確結(jié)果,但是和上一節(jié)的例子一樣,它也是很不安全的,這種不安全性也很難發(fā)現(xiàn),也會給項目后期維護帶來巨大的代價。該程序的安全隱患在哪里呢? 觀察 cal()函數(shù)中的代碼,當(dāng)線程 th1運行后,線程 th2運行,此時,線程 th2隨時可能搶占 CPU,而不一定要等線程 th1運行完畢。當(dāng)然,在上面的例子中,可能因為線程 th1運行較快,th2在它運行的過程中沒有搶占 CPU,“碰巧”得到了正確結(jié)果,但是如果讓線程 th2搶占 CPU,這樣,系統(tǒng)可能得不到正確結(jié)果。為了解釋這個問題,將 該代碼中,增加了一行:程序休眠 1毫秒,讓另一個線程來搶占 CPU。運行,控制臺打印如下: 很顯然,這個結(jié)果不是我們所需要的。 那為什么 sum得到的結(jié)果為 1呢?很明顯,線程 th1的 start函數(shù)運行時,相當(dāng)于讓求和過程以多線程形式運行,在它“休眠”之際, th2就搶占了 CPU,在求和還沒開始做或只完成一部分時就打印 sum,導(dǎo)致得到不正常結(jié)果。 解決方案 怎樣解決?顯而易見,方法是:在運行一個線程時,命令其他線程等待該線程運行完畢,才能搶占 CPU進行運行。對于該問題,不同語言解決方法類似。以 Java語言為例,在 Java語言中,線程的 join()方法可以解決這個問題。 見代碼 運行正常。實際上,該程序相當(dāng)于摒棄了“線程就是為了程序看起來同時做好幾件事情”的思想,將并發(fā)程序又變成了順序的,如果線程 th1沒有運行完畢的話,程序會在 ()處堵塞。如果 cal()函數(shù)耗時較長,程序?qū)⒁恢钡却?。一般的方法是,可以將該工作放在另一個線程中,這樣,既不會堵塞主程序,又能夠保證數(shù)據(jù)安全性。 見代碼 線程死鎖安全 線程死鎖 死鎖 (DeadLock),是指兩個或兩個以上的線程在執(zhí)行過程中,因爭奪資源而造成的一種互相等待的現(xiàn)象。此時稱系統(tǒng)處于死鎖狀態(tài),這些永遠在互相等待的線程稱為死鎖線程。 產(chǎn)生死鎖的四個必要條件是: ? 互斥條件:資源每次只能被一個線程使用。如前面的“線程同步代碼段”,就是只能被一個線程使用的典型資源; ? 請求與保持條件:一個線程請求資源,但因為某種原因,該資源無法分配給它,于是該線程阻塞,此時,它對已獲得的資源保持不放; ? 不剝奪條件:進程已獲得的資源,在未使用完之前,不管其是否阻塞,無法強行剝奪; ? 循環(huán)等待條件:若干進程之間互相等待,形成一種頭尾相接的循環(huán)等待資源關(guān)系。 這四個條件是死鎖的必要條件,只要系統(tǒng)發(fā)生死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會發(fā)生死鎖。 案例分析 以 Java語言為例,死鎖一般來源于代碼段的同步,當(dāng)一段同步代碼被某線程運行時,其他線程可能進入堵塞狀態(tài) (無法搶占 CPU),而剛好在該線程中,訪問了某個對象,此時,除非同步鎖定被解除,否則其他線程就不能訪問那個對象。這可以稱為“線程正在等待一個對象資源”。如果出現(xiàn)一種極端情況,一個線程等候另一個對象,而另一個對象又在等候下一個對象,以此類推。這個“ 等候鏈”如果進入封閉狀態(tài),也就是說,最后那個對象等候的是第一個對象,此時,所有線程都會陷入無休止的相互等待狀態(tài),造成死鎖。盡管這種情況并非經(jīng)常出現(xiàn),但一旦碰到,程序的調(diào)試將變得異常艱難。 在這里給出一個死鎖的案例,如代碼 這段程序也貌似沒有問題。但是和上一節(jié)的例子一樣,它也是很不安全的,這種不安全性也很難發(fā)現(xiàn)。 觀察 run()函數(shù)中的代碼,當(dāng) th1運行后,進入代碼段 1,鎖定了 S1,如果此時 th2運行,搶占 CPU,進入代碼段 3,鎖定 S2,那么 th1就無法運行代碼段 2,但是又沒有釋放 S1,此時, th2也就不能運行代碼段 4。造成互相等待。為了模擬這個過程,我們在程序中增加讓其休眠的代碼,好讓另一個線程來搶占 CPU。將 該代碼中,增加了一行:程序休眠 1000毫秒,讓另一個線程來搶占CPU。運行,控制臺打印如下: 兩個線程陷入無休止的等待。其原因是,線程 th1進入代碼段 1后,線程 2搶占 CPU,鎖定了 S2,而線程 th1對 S1的鎖定又沒有解除,造成線程th2無法運行下去,當(dāng)然,由于線程 th2鎖定了 S2,線程 th1也無法運行下去。 死鎖是一個很重要的問題,它能導(dǎo)致整個應(yīng)用程序慢慢終止,尤其是當(dāng)開發(fā)人員不熟悉如何分析死鎖環(huán)境的時候,還很難被分離和修復(fù)。 解決方案 就語言本身來說,尚未直接提供防止死鎖的幫助措施,需要我們通過謹(jǐn)慎的設(shè)計來避免。一般情況下,我們主要是針對死鎖產(chǎn)生的四個必要條件來進行破壞,用以避免和預(yù)防死鎖。在系統(tǒng)設(shè)計、線程開發(fā)等方面,
點擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1