linuxc线程信号-pthread_cond_wait理解
pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t*mutex)函數
傳入的參數mutex用于保護條件,由于我們在調用pthread_cond_wait時,假設條件不成立我們就進入堵塞。可是進入阻塞這個期間,假設條件變量改變了的話,那我們就漏掉了這個條件。由于這個線程還沒有放到等待隊列上。所以調用pthread_cond_wait前要先鎖相互排斥量,
即調用pthread_mutex_lock(),pthread_cond_wait在把線程放進堵塞隊列后,自己主動對mutex進行解鎖,使得
其他線程能夠獲得加鎖的權利。這樣其他線程才干對臨界資源進行訪問并在適當的時候喚醒這個堵塞的進程。當pthread_cond_wait返回的時候又自己主動給mutex加鎖。
實際上邊代碼的加解鎖步驟例如以下:
/************pthread_cond_wait()的用法**********/
pthread_mutex_lock(&qlock);? ? /*lock*/
pthread_cond_wait(&qready, &qlock); /*block-->unlock-->wait() return-->lock*/
pthread_mutex_unlock(&qlock); /*unlock*/
/*****************************************************/
了解 pthread_cond_wait() 的作用很重要 -- 它是 POSIX 線程信號發送系統的核心,也是最難以理解的部分。
?
首先,讓我們考慮下面情況:線程為查看已鏈接列表而鎖定了相互排斥對象,然而該列表恰巧是空的。這一特定線程什么也干不了 -- 其設計意圖是從列表中除去節點,可是如今卻沒有節點。因此,它僅僅能:?
鎖定相互排斥對象時。線程將調用 pthread_cond_wait(&mycond,&mymutex)。
pthread_cond_wait() 調用相當復雜,因此我們每次僅僅運行它的一個操作。
?
pthread_cond_wait() 所做的第一件事就是同一時候對相互排斥對象解鎖(于是其他線程能夠改動已鏈接列表),并等待條件?signal 發生,當 pthread_cond_wait() 接收到還有一個線程的“信號”時,它將蘇醒(此時還要等其他線程mutex解鎖),蘇醒前會先對mutex加鎖。
轉載于:https://www.cnblogs.com/clnchanpin/p/6877117.html
總結
以上是生活随笔為你收集整理的linuxc线程信号-pthread_cond_wait理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【面试笔记系列】排序算法汇总
- 下一篇: 第十章_文件上传