• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 200, comments - 8, trackbacks - 0, articles - 0

            進程/線程 同步機制

            Posted on 2012-12-14 11:46 鑫龍 閱讀(498) 評論(0)  編輯 收藏 引用 所屬分類: linux編程

            1 什么時候需要同步?

            2 在linux中, 線程同步機制有哪些?各適用在怎樣的條件?進程同步有哪些?對應的數據類型、API 各有哪些?
            在當前的POSIX標準中有三種線程同步機制,它們分別是:互斥量、讀寫鎖、條件變量。
            關于進程同步機制,POSIX定義了一種信號燈,而system V 定義了另外一種信號燈。
            ---------------------------------------------------------------------- 
            線程同步

            (1)、互斥量(mutex)

              互斥量本質上是一把鎖,在訪問共享資源前對互斥量進行加鎖,在訪問完成后釋放互斥量上的鎖。

              對互斥量進行加鎖以后,任何其它試圖再次對互斥量加鎖的線程將會被阻塞直到當前線程釋放該互斥鎖。如果釋放互斥鎖時有多個線程阻塞,所有在該互斥鎖上的阻塞線程都會變成可運行狀態,第一個變為運行狀態的線程可以對互斥量加鎖,其它線程將會看到互斥鎖依然被鎖住,只能回去再次等待它重新變為可用。在這種情況下,每次只有一個線程可以向前執行。

            pthread_mutex_t 
            pthread_mutex_init();
            pthread_mutex_lock();
            pthread_mutex_unlock();
            pthread_mutex_destroy();
            (2)、讀寫鎖

              讀寫鎖與互斥量類似,不過讀寫鎖允許更高的并行性。互斥量要么是鎖住狀態要么是不加鎖狀態,而且一次只有一個線程可以對其加鎖。

              讀寫鎖可以由三種狀態:讀模式下加鎖狀態寫模式下加鎖狀態不加鎖狀態。一次只有一個線程可以占有寫模式的讀寫鎖,但是多個線程可以同時占有讀模式的讀寫鎖。

              在讀寫鎖是寫加鎖狀態時,在這個鎖被解鎖之前,所有試圖對這個鎖加鎖的線程都會被阻塞。當讀寫鎖在讀加鎖狀態時,所有試圖以讀模式對它進行加鎖的線程都可以得到訪問權,但是如果線程希望以寫模式對此鎖進行加鎖,它必須阻塞直到所有的線程釋放讀鎖。雖然讀寫鎖的實現各不相同,但當讀寫鎖處于讀模式鎖住狀態時,如果有另外的線程試圖以寫模式加鎖,讀寫鎖通常會阻塞隨后的讀模式鎖請求。這樣可以避免讀模式鎖長期占用,而等待的寫模式鎖請求一直得不到滿足。

              讀寫鎖非常適合于對數據結構讀的次數遠大于寫的情況。當讀寫鎖在寫模式下時,它所保護的數據結構就可以被安全地修改,因為當前只有一個線程可以在寫模式下擁有這個鎖。當讀寫鎖在讀狀態下時,只要線程獲取了讀模式下的讀寫鎖,該鎖所保護的數據結構可以被多個獲得讀模式鎖的線程讀取。

              讀寫鎖也叫做共享-獨占鎖,當讀寫鎖以讀模式鎖住時,它是以共享模式鎖住的;當他以寫模式鎖住時,它是以獨占模式鎖住的。

            pthread_rwlock_t
            pthread_rwlock_init();
            pthread_rwlock_rdlock();
            pthread_rwlock_wrlock();
            pthread_rwlock_unlock();
            pthread_rwlock_destroy();
            (3) 、條件變量(condition)和監視器(monitor)

              條件變量與互斥量一起使用時,允許線程以無競爭的方式等待特定的條件發生。

              條件本身是由互斥量保護的。線程在改變條件狀態前必須首先鎖住互斥量,其它線程在獲得互斥量之前不會察覺到這種改變,因此必須鎖定互斥量以后才能計算條件。

            pthread_cond_t
            pthread_cond_init();
            pthreadf_cond_wait();
            pthread_cond_signal();
            pthread_cond_destroy();
            ----------------------------------------------------------------------
            進程同步 
            信號量(Semaphore),有時被稱為信號燈,是在多線程環境下使用的一種設施,是可以用來保證兩個或多個關鍵代碼段不被并發調用。在進入一個關鍵代碼段之前,線程必須獲取一個信號量;一旦該關鍵代碼段完成了,那么該線程必須釋放信號量。其它想進入該關鍵代碼段的線程必須等待直到第一個線程釋放信號量。為了完成這個過程,需要創建一個信號量VI,然后將Acquire Semaphore VI以及Release Semaphore VI分別放置在每個關鍵代碼段的首末端。確認這些信號量VI引用的是初始創建的信號量。

            POSIX信號燈:
            sem_t
            sem_open();
            sem_init();
            sem_wait();
            sem_post();
            sem_close();
            sem_unlink();
            SysV信號燈:
            semget();
            semop();
            semctl();
            3 線程同步機制和進程同步機制有什么區別?哪個使用的范圍更大?
            顯然進程同步機制可以用于線程同步,而線程同步機制不能用于進程同步。




            亚洲国产精品一区二区久久| 大香伊人久久精品一区二区| 国产成人精品白浆久久69| 性高湖久久久久久久久| 久久最新精品国产| 亚洲人成无码www久久久| 亚洲色大成网站www久久九| 久久亚洲国产午夜精品理论片| 国产福利电影一区二区三区久久老子无码午夜伦不 | 久久Av无码精品人妻系列| 精品免费tv久久久久久久| 香蕉99久久国产综合精品宅男自 | 午夜不卡久久精品无码免费| 中文精品久久久久国产网址| 影音先锋女人AV鲁色资源网久久| 亚洲国产精品热久久| 久久久无码精品亚洲日韩蜜臀浪潮| 久久久久亚洲爆乳少妇无| 久久人人爽人人爽人人片av高请| 色综合久久中文字幕综合网| 99久久精品国产毛片| 99久久国产综合精品麻豆| 国产69精品久久久久APP下载| 久久精品国产99久久丝袜| 久久综合丁香激情久久| 国产人久久人人人人爽| 久久狠狠高潮亚洲精品| 久久久久久精品无码人妻| 婷婷久久五月天| 伊人久久亚洲综合影院| 久久男人中文字幕资源站| 久久99精品国产麻豆婷婷| 国产精品欧美亚洲韩国日本久久| 久久夜色精品国产亚洲| 99久久精品免费国产大片| 色综合久久天天综合| 99久久精品国产一区二区| 久久国产精品免费一区| 深夜久久AAAAA级毛片免费看| 久久这里都是精品| 久久精品国产亚洲av麻豆蜜芽 |