乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      編程思想之多線程與多進程(2)——線程優(yōu)先級與線程安全

       cjavahtml 2017-05-02
        原文:http://blog.csdn.net/luoweifu/article/details/46701167

        作者:luoweifu

        轉載請標名出處

        《編程思想之多線程與多進程(1)——以操作系統(tǒng)的角度述說線程與進程》一文詳細講述了線程、進程的關系及在操作系統(tǒng)中的表現,這是多線程學習必須了解的基礎。本文將接著講一下線程優(yōu)先級和線程安全。

      【前言總結:信號量(分二元和多元),互斥量,臨界區(qū)。它們嚴格程度依次遞增?!?br/>
        線程優(yōu)先級

        現在主流操作系統(tǒng)(如Windows、Linux、Mac OS X)的任務調度除了具有前面提到的時間片輪轉的特點外,還有優(yōu)先級調度(Priority Schedule)的特點。優(yōu)先級調度決定了線程按照什么順序輪流執(zhí)行,在具有優(yōu)先級調度的系統(tǒng)中,線程擁有各自的線程優(yōu)先級(Thread Priority)。具有高優(yōu)先級的線程會更早地執(zhí)行,而低優(yōu)先級的線程通常要等沒有更高優(yōu)先級的可執(zhí)行線程時才會被執(zhí)行。

        線程的優(yōu)先級可以由用戶手動設置,此外系統(tǒng)也會根據不同情形調整優(yōu)先級。通常情況下,頻繁地進入等待狀態(tài)(進入等待狀態(tài)會放棄之前仍可占用的時間份額)的線程(如IO線程),比頻繁進行大量計算以至于每次都把所有時間片全部用盡的線程更受操作系統(tǒng)的歡迎。因為頻繁進入等待的線程只會占用很少的時間,這樣操作系統(tǒng)可以處理更多的任務。我們把頻繁等待的線程稱之為IO密集型線程(IO Bound Thread),而把很少等待的線程稱之為CPU密集型線程(CPU Bound Thread)。IO密集型線程總是比CPU密集型線程更容易得到優(yōu)先級的提升。

        線程餓死:

        在優(yōu)先級調度下,容易出現一種線程餓死的現象。一個線程餓死是說它的優(yōu)先級較低,在它執(zhí)行之前總是有比它優(yōu)先級更高的線程等待執(zhí)行,因此這個低優(yōu)先級的線程始終得不到執(zhí)行。當CPU密集型的線程優(yōu)先級較高時,其它低優(yōu)先級的線程就很可能出現餓死的情況;當IO密集型線程優(yōu)先級較高時,其它線程相對不容易造成餓死的善,因為IO線程有大量的等待時間。為了避免線程餓死,調度系統(tǒng)通常會逐步提升那些等待了很久而得不到執(zhí)行的線程的優(yōu)先級。這樣,一個線程只要它等待了足夠長的時間,其優(yōu)先級總會被提升到可以讓它執(zhí)行的程度,也就是說這種情況下線程始終會得到執(zhí)行,只是時間的問題。

        在優(yōu)先級調度環(huán)境下,線程優(yōu)先級的改變有三種方式:

        1. 用戶指定優(yōu)先級;

        2. 根據進入等待狀態(tài)的頻繁程度提升或降低優(yōu)先級(由操作系統(tǒng)完成);

        3. 長時間得不到執(zhí)行而被提升優(yōu)先級。

        線程安全與鎖

        在多個線程并發(fā)執(zhí)行訪問同一個數據時,如果不采取相應的措施,將會是非常危險的。假設你在工行有一個銀行賬戶,兩張銀聯(lián)卡(自己手里一張,女朋友手里一張),里面有100萬。假設取錢就兩個過程:1.檢查賬戶余額,2.取出現金(如果要取出的金額 > 賬戶余額,則取現成功,否則取現失敗)。有一天你要買房想把錢取出來,而此時你女朋友也想買一輛車(假設你們事先沒有商量)。兩個人都在取錢,你在A號ATM機取100萬,女朋友在B號ATM機取80萬。這時A號ATM檢查賬戶余額發(fā)現有100萬,可以取出;而與此同時,同一時刻B號ATM也在檢查賬戶余額發(fā)現有100萬,可以取出;這樣,A、B都把錢取出來了。

        100萬的存款取出180萬,銀行就虧大發(fā)了(當然你就笑呵呵了……)!這就是線程并發(fā)的不安全性。為避免這種情況發(fā)生,我們要將多個線程對同一數據的訪問同步,確保線程安全。

        所謂同步(synchronization)就是指一個線程訪問數據時,其它線程不得對同一個數據進行訪問,即同一時刻只能有一個線程訪問該數據,當這一線程訪問結束時其它線程才能對這它進行訪問。同步最常見的方式就是使用鎖(Lock),也稱為線程鎖。鎖是一種非強制機制,每一個線程在訪問數據或資源之前,首先試圖獲取(Acquire)鎖,并在訪問結束之后釋放(Release)鎖。在鎖被占用時試圖獲取鎖,線程會進入等待狀態(tài),直到鎖被釋放再次變?yōu)榭捎谩?br/>
        二元信號量

        二元信號量(Binary Semaphore)是一種最簡單的鎖,它有兩種狀態(tài):占用和非占用。它適合只能被唯一一個線程獨占訪問的資源。當二元信號量處于非占用狀態(tài)時,第一個試圖獲取該二元信號量鎖的線程會獲得該鎖,并將二元信號量鎖置為占用狀態(tài),之后其它試圖獲取該二元信號量的線程會進入等待狀態(tài),直到該鎖被釋放。

        信號量

        多元信號量允許多個線程訪問同一個資源,多元信號量簡稱信號量(Semaphore),對于允許多個線程并發(fā)訪問的資源,這是一個很好的選擇。一個初始值為N的信號量允許N個線程并發(fā)訪問。線程訪問資源時首先獲取信號量鎖,進行如下操作:

        1. 將信號量的值減1;

        2. 如果信號量的值小于0,則進入等待狀態(tài),否則繼續(xù)執(zhí)行;

        訪問資源結束之后,線程釋放信號量鎖,進行如下操作:

        1. 將信號量的值加1;

        2. 如果信號量的值小于1(等于0),喚醒一個等待中的線程;

        互斥量

        互斥量(Mutex)和二元信號量類似,資源僅允許一個線程訪問。與二元信號量不同的是,信號量在整個系統(tǒng)中可以被任意線程獲取和釋放,也就是說,同一個信號量可以由一個線程獲取而由另一線程釋放。而互斥量則要求哪個線程獲取了該互斥量鎖就由哪個線程釋放,其它線程越俎代庖釋放互斥量是無效的。

        臨界區(qū)

        臨界區(qū)(Critical Section)是一種比互斥量更加嚴格的同步手段?;コ饬亢托盘柫吭谙到y(tǒng)的任何進程都是可見的,也就是說一個進程創(chuàng)建了一個互斥量或信號量,另一進程試圖獲取該鎖是合法的。而臨界區(qū)的作用范圍僅限于本進程,其它的進程無法獲取該鎖。除此之處,臨界區(qū)與互斥量的性質相同。

        讀寫鎖

        讀寫鎖(Read-Write Lock)允許多個線程同時對同一個數據進行讀操作,而只允許一個線程進行寫操作。這是因為讀操作不會改變數據的內容,是安全的;而寫操作會改變數據的內容,是不安全的。對同一個讀寫鎖,有兩種獲取方式:共享的(Shared)和獨占的(Exclusive)。當鎖處于自由狀態(tài)時,試圖以任何一種方式獲取鎖都能成功,并將鎖置為對應的狀態(tài);如果鎖處于共享狀態(tài),其它線程以共享方式獲取該鎖,仍然能成功,此時該鎖分配給了多個線程;如果其它線程試圖如獨占的方式獲取處于共享狀態(tài)的鎖,它必須等待所有線程釋放該鎖;處于獨占狀態(tài)的鎖阻止任何線程獲取該鎖,不論它們以何種方式。獲取讀寫鎖的方式總結如下:

        讀寫鎖的狀態(tài) 以共享方式獲取 以獨占方式獲取

        自由 成功 成功

        共享 成功 等待

        獨占 等待 等待

        表 1 :獲取讀寫鎖的方式

        如果您有什么疑惑和想法,請在評論處給予反饋,您的反饋就是最好的測評師!由于本人技術和能力有限,如果本博文有錯誤或不足之處,敬請諒解并給出您寶貴的建議!

        原文:http://blog.csdn.net/luoweifu/article/details/46701167

        作者:luoweifu

        轉載請標名出處

        ========================編程思想系列文章回顧========================

        ========================編程思想系列文章回顧========================

        編程思想之多線程與多進程

        編程思想之消息機制

        編程思想之日志記錄

        編程思想之異常處理

        編程思想之正則表達式

        編程思想之迭代器

        編程思想之遞歸

        編程思想之回調

        本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
        轉藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多