• <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>

            大龍的博客

            常用鏈接

            統計

            最新評論

            pthread_cond_wait() --- 轉

            了解 pthread_cond_wait() 的作用非常重要 -- 它是 POSIX 線程信號發送系統的核心,也是最難以理解的部分。

            首先,讓我們考慮以下情況:線程為查看已鏈接列表而鎖定了互斥對象,然而該列表恰巧是空的。這一特定線程什么也干不了 -- 其設計意圖是從列表中除去節點,但是現在卻沒有節點。因此,它只能:

            鎖定互斥對象時,線程將調用 pthread_cond_wait(&mycond,&mymutex)。pthread_cond_wait() 調用相當復雜,因此我們每次只執行它的一個操作。

            pthread_cond_wait() 所做的第一件事就是同時對互斥對象解鎖(于是其它線程可以修改已鏈接列表),并等待條件 mycond 發生(這樣當 pthread_cond_wait() 接收到另一個線程的“信號”時,它將蘇醒)。現在互斥對象已被解鎖,其它線程可以訪問和修改已鏈接列表,可能還會添加項。 【要求解鎖并阻塞是一個原子操作】

            此時,pthread_cond_wait() 調用還未返回。對互斥對象解鎖會立即發生,但等待條件 mycond 通常是一個阻塞操作,這意味著線程將睡眠,在它蘇醒之前不會消耗 CPU 周期。這正是我們期待發生的情況。線程將一直睡眠,直到特定條件發生,在這期間不會發生任何浪費 CPU 時間的繁忙查詢。從線程的角度來看,它只是在等待 pthread_cond_wait() 調用返回。

            現在繼續說明,假設另一個線程(稱作“2 號線程”)鎖定了 mymutex 并對已鏈接列表添加了一項。在對互斥對象解鎖之后,2 號線程會立即調用函數 pthread_cond_broadcast(&mycond)。此操作之后,2 號線程將使所有等待 mycond 條件變量的線程立即蘇醒。這意味著第一個線程(仍處于 pthread_cond_wait() 調用中)現在將蘇醒。

            現在,看一下第一個線程發生了什么。您可能會認為在 2 號線程調用 pthread_cond_broadcast(&mymutex) 之后,1 號線程的 pthread_cond_wait() 會立即返回。不是那樣!實際上,pthread_cond_wait() 將執行最后一個操作:重新鎖定 mymutex。一旦 pthread_cond_wait() 鎖定了互斥對象,那么它將返回并允許 1 號線程繼續執行。那時,它可以馬上檢查列表,查看它所感興趣的更改。

            停止并回顧!
            那個過程非常復雜,因此讓我們先來回顧一下。第一個線程首先調用:

             

            pthread_mutex_lock(&mymutex);

             


            然后,它檢查了列表。沒有找到感興趣的東西,于是它調用:

             

            pthread_cond_wait(&mycond, &mymutex);

             


            然后,pthread_cond_wait() 調用在返回前執行許多操作:

             

            pthread_mutex_unlock(&mymutex);

             


            它對 mymutex 解鎖,然后進入睡眠狀態,等待 mycond 以接收 POSIX 線程“信號”。一旦接收到“信號”(加引號是因為我們并不是在討論傳統的 UNIX 信號,而是來自 pthread_cond_signal() 或 pthread_cond_broadcast() 調用的信號),它就會蘇醒。但 pthread_cond_wait() 沒有立即返回 -- 它還要做一件事:重新鎖定 mutex:

             

            pthread_mutex_lock(&mymutex);

             


            pthread_cond_wait() 知道我們在查找 mymutex “背后”的變化,因此它繼續操作,為我們鎖定互斥對象,然后才返回。

            posted on 2010-05-22 02:21 大龍 閱讀(650) 評論(0)  編輯 收藏 引用

            久久综合给合久久狠狠狠97色 | 国产三级久久久精品麻豆三级| 青青草国产97免久久费观看| 无码人妻精品一区二区三区久久 | 欧美久久一级内射wwwwww.| 久久久久久毛片免费看| 无码任你躁久久久久久久| 伊人久久大香线焦AV综合影院| 久久亚洲美女精品国产精品| 亚洲嫩草影院久久精品| 99精品国产免费久久久久久下载| 亚洲AV无码久久精品色欲| 精品久久国产一区二区三区香蕉| yy6080久久| 久久精品国产亚洲5555| 久久久一本精品99久久精品66| 久久美女网站免费| 少妇内射兰兰久久| 天天综合久久一二三区| 91精品国产91久久久久久青草| 久久无码专区国产精品发布 | 亚洲色欲久久久综合网| 久久国产精品偷99| 久久精品国产久精国产思思| 伊人久久亚洲综合影院| 国产福利电影一区二区三区,免费久久久久久久精 | 久久久一本精品99久久精品88| 久久国产视频99电影| 国产A级毛片久久久精品毛片| 亚洲AV无码久久精品狠狠爱浪潮| 久久久久国产一级毛片高清板 | 亚洲国产综合久久天堂 | 99久久精品九九亚洲精品| 人妻无码久久一区二区三区免费 | 久久伊人精品青青草原日本| 久久青青草原综合伊人| 国内精品九九久久久精品| 7777久久久国产精品消防器材| 伊人伊成久久人综合网777| 亚洲国产精品综合久久网络 | 99精品久久精品一区二区|