Re: [問題] C 語言檢查程式中記憶體是否改變的方法

看板C_and_CPP (C/C++)作者 (巴肥特)時間12年前 (2013/11/09 21:47), 編輯推噓1(104)
留言5則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《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

11/09 21:50, , 1F
pthread_cond_wait 是 stateless , 你 cond_wakeup 一百次
11/09 21:50, 1F

11/09 21:51, , 2F
可能只有執行 五次 , cond_wait 前呼叫 wakeup都無效
11/09 21:51, 2F

11/09 21:52, , 3F
semaphore 則 sem_post 一百次,sem_wait 之後一定執行一百
11/09 21:52, 3F

11/09 21:53, , 4F
次,因為它是 state 的方式 , 跟 cond_wait 有很大差別!
11/09 21:53, 4F

11/13 19:18, , 5F
今天把 code 改成了這個方式,很好用,感恩啊
11/13 19:18, 5F
文章代碼(AID): #1IVZp_3P (C_and_CPP)
文章代碼(AID): #1IVZp_3P (C_and_CPP)