看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《ck49 (心動)》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : Linux gcc : 問題(Question): : 小弟有兩個 Global 變數 : unsigned char a, b; : 這兩個變數會在某個 thread 中被修改 : 在另一個 thread 中監視這兩個值 : 目前的寫法 : while(1){ : if(a != b){ : //do someting : } else { : usleep(100); : } : } : 感覺上不是什麼多好的方法, : 想請問高手們是否有其他更好的做法? : 感恩 '可以使用 semaphore , 當 thread1 修改使的 a!=b , then sem_post(sem1) thread2 可以使用 sem_wait like : while(1) { sem_wait(sem1); //do something !! } semaphore , sem_post 會加一如果當時值為0,則順便把 sem_wait 叫醒, sem_wait 當值>0就會把值減一往下執行,但是值為0的話,就 block and wait, sem_post叫醒 sem_wait 時,往下執行且值減一又變成0,下一圈 sem_wait 又 block and wait 了 !! 當 thread2 sem_wait 被叫醒後, a != b 情況可能已經改變了 , 你如果堅持一定要 thread1 發生 a != b 保持現場,直到 thread2 看到當時現狀後 才能讓 thread1 繼續往下走,可用 : thread1 : while(1) { //something if(a != b) { sem_post(sem1); //tell thread2 a != b sem_wait(sem2) ; //wait thread2 to be told go on } } thread2: while(1) { sem_wait(sem1) ; //wait thread1 to inform //do something sem_post(sem2) ; //tell thread1 can go on } sem 的初值可設成 0 ... -- 去年今日此門中,人面桃花相映紅。人面不知何處在?桃花依舊笑春風。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.136.159.180
barfat:pthread_cond_wait 是 stateless , 你 cond_wakeup 一百次 11/09 21:50
barfat:可能只有執行 五次 , cond_wait 前呼叫 wakeup都無效 11/09 21:51
barfat:semaphore 則 sem_post 一百次,sem_wait 之後一定執行一百 11/09 21:52
barfat:次,因為它是 state 的方式 , 跟 cond_wait 有很大差別! 11/09 21:53
ck49:今天把 code 改成了這個方式,很好用,感恩啊 11/13 19:18