b92902xxx 板


LINE

話說最後一次的課程在難得的準時下課下結束了, 但... 還沒結束呢... 這只是一切的開端... 各位應該還記得最後一話有一個 volatile 吧? 當時司令是將其草草帶過了, 但是事實上它會被安排在 signal 之前是有其特殊的意義的, 而且其功能就實務上常常難以取代, 所以現在來詳談 volatile. 先來談談 signal. signal 其實是有一點非常特殊的性質的, 我們來看看這份 code: -------------------------------------------------- int main(){ for(;1;){ } return 0; } -------------------------------------------------- 任何人應該都認為這是一個跑不完的程式吧? 程式的流程走進無窮的 for 迴圈, 眼前是大括號的重重包圍, 無路可逃. 但是事實上在這看似死牢的 for 中卻有一道空間的裂縫, 那就是 signal, 它可以讓你的程式流程瞬間傳送到 signal 的 handler, signal 超脫了自然的定律, 是 compiler 完全無法預期的. 接下來我們再看這一份 code: -------------------------------------------------- int a; int main(){ for(a=1;a;){ } return 0; } -------------------------------------------------- 從這份 code 我們看到了什麼? a 在進到 for 的時候被設成了 1, 然後迴圈中沒有任何一行有變動它, 所以 compiler 很有可能認為迴圈中的 a 可以不用看就知道是 1, 而將我們的 for 變成這樣: for(a=1;1;) 這樣看起來也很合理吧? 最後我們來看這一份 code: -------------------------------------------------- int a; void sighand(int signo){ printf ("Don't kill me. I'll suicide.\n"); a = 0; } int main(){ signal (2, sighand); for (a=1;a;){ } return 0; } -------------------------------------------------- 對於這份 code, compiler 也很有可能認為會動到 a 的只有 sighand, 而進入 for 之後, 再也沒有出現過 sighand, 所以認為 a 在 for 中會是定值 1, 因此而將我們的 for(a=1;a;) 變成 for(a=1;1;). 但是 compiler 錯了. 由於 signal 這個空間的裂縫, 我們可以經由 kill -2 [pid] 將程式的流程跳入 sighand, 因此 a 是定值 1 這件假設在預期外的情形被打破了, 在這裡即使我們被 kill -2, for 仍然會鐵齒地認為 a 仍然是 1, 所以不用出去, 結果該跳出的迴圈沒有跳出. 為了避免這個問題, 我們的主角 volatile 登場了. volatile 本意並不是司令所講的"禁止最佳化", 它的本意其實是用來告訴 compiler 該變數可能會產生預期外的變動, 所以不要對該變數的內容太鐵齒, 為了達成這目標的副作用就是造成許多最佳化無法進行. 所以, 上面的 code 改成以下就保證可以正確執行: -------------------------------------------------- volatile int a; void sighand(int signo){ printf ("Don't kill me. I'll suicide.\n"); a = 0; } int main(){ signal (2, sighand); for (a=1;a;){ } return 0; } -------------------------------------------------- 這個時候我們的 compiler 雖然一心認為 a 在 for 裡面應該要會是定值 1, 但是由於 volatile 的叮嚀, 最後 compiler 還是要求我們的程式每跑一圈一定要確實檢查 a, 結果我們真的抓到 sighand 偷換了 a 的值, 而能夠正常的結束迴圈. 圓滿的大結局不是嗎? ;) -- その乾いた哀愁の瞳に去來するものは何か? 失ったもの 得たもの そして廣大なネットの狹間で彼が見たものとは? 虛像と實存と記號の中に彼は今、何を想うのか? <バトルプログラマーシラセ> --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.30.49
1F:→ IrisXIII:好文...推~ 推 140.112.25.181 01/07
2F:→ aacs0130:推~~~不M不行啦 推140.112.171.150 01/07
3F:→ JEF655045:推+1 推 61.230.50.184 01/07
4F:→ drjoey:地下司令嗎??? 推 140.112.25.182 01/08
5F:→ pangfeng:講的很好, 謝謝. 推 140.112.28.27 01/08







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Gossiping站內搜尋

TOP