2017 Operating Systems 作業系統實習 助教:陳主恩、林欣穎 實驗室:720A Lab10 1
目錄 Contents 條件變數介紹 Beaglebone 條件變數範例 Beaglebone 實作 Beaglebone 2
1-1 條件變數介紹 條件變數(Condition Variable) 條件變數(Condtion Variable)是在多執行緒程序中用來實現“等待->喚醒”邏輯常用的方法。 Ex: 應用程序A中包含兩個執行緒t1和t2。t1需要在bool變數test_cond為true時才能繼續執行,而test_cond的值是由t2來改變的。 方法: t1在test_cond為false時呼叫cond_wait進行等待,t2在改變test_cond的值後,呼叫cond_signal,喚醒在等待中的t1,告訴t1 test_cond的值變了,這樣t1便可繼續往下執行。 3
1-2 條件變數介紹 條件變數(Condition Variable) 函式宣告: pthread_cond_init (pthread_cond_t *cond, const pthread_condattr_t *attr); 初始化 標頭檔: #include <pthread.h> int pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex); 等待某個條件 說明: 鎖定和解除鎖定 cond 變數,採用互斥的方式,同時間內只 有一個Thread 可以鎖定cond,其他的Thread 會被Block 住,和上mutex 不同的是喚醒功能。而且必須依靠Mutex 保護才能使用。 int pthread_cond_timedwait (pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime); 多了一時間參數,過abstime段時間後,即使條件變數不滿足,mutex也被解除 int pthread_cond_signal(pthread_cond_t *cond); 喚醒在wait 同一個條件的中的一個Thread 傳回值: 傳回 0 代表成功,非0 代表失敗 int pthread_cond_broadcast(pthread_cond_t *cond ); 喚醒在wait 同一個條件的中的所有Thread 4
1-3 條件變數介紹 條件變數(Condition Variable) Q. 為什麼要與pthread_mutex 一起使用呢? A. 這是為了應對執行緒1在呼叫pthread_cond_wait()但執行緒1還沒有進入wait cond的狀態的時候,此時執行緒2呼叫了 cond_singal 的情況。 如果不用mutex鎖的話,這個cond_singal就丟失了。加了鎖的情況是,執行緒2必須等到 mutex 被釋放(也就是 pthread_cod_wait() 進入wait_cond狀態 並自動釋放mutex) 的時候才能呼叫cond_singal. 5
條件變數範例 2-1 條件變數程式碼 gcc --std=c99 test1.c -o test1 -lpthread 6
Semaphore 範例 7
實作課本第六章的project2,並抽問問題 (使用附件程式) 8
Thanks 作業系統實習 Operating Systems