第4章 用同步訊號程式設計

2022-09-21 13:00:16 字數 1390 閱讀 4903

條件變數

1. 條件變數初始化

1

//方法1

2 pthread_cond_t cv =pthread_cond_initializer;34

5//方法26

pthread_cond_t cv;

7pthread_condattr_t cattr;

8int

ret;910

/*initialize a condition variable to its default value

*/11 ret = pthread_cond_init(&cv, null);

1213

14//

條件變數其實可以有屬性,但是一般忽略,linux中也沒有實現

15/*

initialize a condition variable

*/16 ret = pthread_cond_init(&cv, &cattr);

2. 條件變數登出

int pthread_cond_destroy(pthread_cond_t *cv);

注意:條件變數登出後,並沒有釋放使用者儲存條件變數的空間

只有在沒有執行緒在該條件變數上等待的時候才能登出這個條件變數,否則返回ebusy。

因為linux實現的條件變數沒有分配什麼資源,所以登出動作只包括檢查是否有等待執行緒。

3. 基於條件變數阻塞

int pthread_cond_wait(pthread_cond_t *cv, pthread_mutex_t *mutex);

如果條件變數cv沒有滿足,pthread_cond_wait()就會釋放鎖+阻塞,等待喚醒;

喚醒之後,pthread_cond_wait()首先會拿到鎖,然後就沒有然後了,函式完成,繼續往下走!

① pthread_cond_wait()要與互斥鎖一起使用,即在互斥鎖的保護下使用,因為該函式有乙個釋放鎖步驟

—— 這是我理解的使用鎖的原因,目前沒有找到更有說服力的,待求證???

② pthread_cond_wait()建議與while()一起使用

pthread_mutex_lock();

while

(condition_is_false)

pthread_cond_wait();

pthread_mutex_unlock();

官方給出的解釋是:

喚醒的執行緒重新獲取互斥鎖並從pthread_cond_wait()返回之前,條件可能會發生變化,等待執行緒可能並未真正喚醒。

建議使用的測試方法是,將條件檢查編寫為呼叫pthread_cond_wait()while()迴圈。

第4章 選擇結構程式設計

例4.6 要求按照考試成績的等級輸出百分之分數段,a等級為85分以上,b等為70 84分,c等為60 69分,d等為60分以下。成績的等級由鍵盤輸入。例4.7 用switch語句處理選單命令。在許多應用程式中,用選單對流程進行控制,例如從鍵盤輸入乙個 a 或 a 字元,就會執行a 操作,輸入乙個 b...

第4章 選擇結構程式設計

例4.1 判別方程ax 2 bx c 0的根。include includeint main return 0 執行結果如下 例4.2 輸入兩個實數,按由小到大的順序輸出。includeint main printf 5.2f,5.2f n a,b return 0 執行結果如下 例4.3 輸入三個...

第4章 選擇結構程式設計

例4.1 求ax bx c 0的根,由鍵盤輸入a,b,c。c include include int main return 0 執行結果如下 例4.2 輸入兩個實數,按由小到大的順序輸出這兩個數。c include int main printf 5.2f,5.2f n a,b return 0 ...