作者barfat (巴肥特)
看板C_and_CPP
標題Re: [問題] C 語言檢查程式中記憶體是否改變的方法
時間Sat Nov 9 21:47:39 2013
※ 引述《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