推 kiii210:dispatch_once 08/02 15:15
那請問你會怎麼implement這功能呢?
或著也可以去看source code,如果能花幾分鐘解釋清楚,他們那樣做的原因
我也會認為你很厲害~~
※ 編輯: uid88 (98.234.114.205), 08/02/2014 15:31:02
→ eboy:可以把主程式func都註解掉嗎? 08/02 15:35
→ eboy:我來亂的XDD 08/02 15:37
推 lichai:樓上並不是來亂的 因為我第一時間也是想出這個答案 08/02 15:39
→ lichai:不過我猜樓主心理已有標準答案 結果對 過程不對一樣零分 08/02 15:40
拿零分其實很難的~ 弄個bool來判斷有沒有執行過也不錯啊
要加在哪裡? 這樣做會有什麼問題?
推 jily:singleton? 08/02 15:43
嗯,要怎麼加?
→ testPtt:我第一次工作也像eboy說的那樣做 結果後來加班到快死 08/02 15:44
謝謝分享,這個好笑 XD
→ x000032001:加一個mutex lock和變數讓他只印一次 08/02 15:55
謝謝特地還寫code!
很好,既然用了lock,要不要想一下通常lock比較會搞出什麼問題?
推 kiii210:我會用dispatch_once...但是我不會把dispatch_once重新 08/02 16:22
→ kiii210:implement一次 /__\ 08/02 16:22
會用也很好啊,你已經知道了他的精神。
有機會想想看你自己的話會怎麼做? 看可以做到什麼程度
→ x000032001:大概是busy-waiting之類的..不太確定 08/02 16:30
喔~busy-waiting這個名詞都出來了,有加分喔(因為用得很對; 雖然我不喜歡背名詞)
事實上有比這個busy-waiting還嚴重的問題: deadlock(有lock嘛,就有可能會dead)
在類似mutex lock功能之中,有沒有不會deadlock而在這裡可以用的東西?
→ x000032001:記得是有semaphore或monitor 不過這code很短 08/02 16:45
→ x000032001:只有一次inc和一個if 我覺得是不太會出現starving 08/02 16:45
→ x000032001:或是deadlock (只有一個條件變數也不符合循環等待) 08/02 16:46
很多系統都有提供interlocked exchange的功能
即使是在多核心多工的狀況下,也保證某一變數只會有一個人動它
這功能只做上面這件事,不會佔住資源,所以不會deadlock
找到的這一篇不錯喔~
如果能看完看懂,我也會覺得你很強
接下來用它的精神,看看你自己的implementation可以做到什麼程度
推 CSLabor:在第二個func()前面加return (誤) 08/02 17:05
快要笑不動了... (真正面試時千萬不要用...) XD
※ 編輯: uid88 (98.234.114.205), 08/02/2014 17:16:08
接下來就要加一個條件: 第二次以後叫的要等第一次執行完才能回去
這也算是很合裡的要求,如果第二次以後的太早回去
等於說一次都沒做完就繼續接下來的事... 不太對
所以要建立一個等待的機制...
現在有等,如果也有前面提的mutex lock,形成deadlock的條件已經到齊:
假設printf所代表的功能裡需要一個資源A,第二次叫的傢伙又不幸先拿了A才叫func
就形成了"拿著A的等lock,拿著lock的等A"的deadlock
用interlocked exchange的好處就是可以避掉這種潛在的問題
整理一下
這問題回答程度可以總結為:
1. 用變數去記錄有沒有執行過
2. 用global變數
3. 用程序裡static變數
4. 考慮multi-thread的情形
用mutex, semaphore, critical section或是interlocked exchange都可以
5. interlocked exchange最合適的原因
6. 第二次以後叫的要等第一次執行完才能回去
7. 建構成可以泛用的機制
通常我會期待大學出來的到2
研究所到3,還要瞭解一些4
做過幾年的到5
資深的要能在邏輯上嚴謹的做好6,7也要有一些概念
※ 編輯: uid88 (98.234.114.205), 08/02/2014 17:45:17
→ x000032001:可是大學OS就會教4了吧 我也是上學期上過而已..XD 08/02 18:07
推 ericlin:我也覺得大學畢業生應該要講出 (4) 08/02 18:26
在學校是學了很多,如果這是問答式的題目的話,上完課確實可以回答
可是實際上要熟悉它,寫進程式裡面,我估計需要一些實作的經驗
→ enthos:defer func : zzz ; : hi ." Hi." cr ['] zzz is func ; 08/02 18:27
→ enthos:: a func ; : main func a func ; ' hi is func \ FORTH 08/02 18:27
→ testPtt:有人會去刻4的code嗎? 還是都直接用現有的api? 08/02 18:55
用系統的服務就好
→ robler:以題目的要求來說,用變數就夠了,其它的太搞剛 08/02 19:43
確實是。可是題目會慢慢加一些條件,看回答的人能做到多深
→ ENEP:可以用(function once (){do something})() 嗎XDDD 08/02 21:19
→ banjmin:IIFE都出來了 有java版解法嗎? 08/02 22:08
推 Gaogaigar:這裡的interlocked exchange指的是像atomic O.P的意思嗎 08/02 22:25
對的
→ hpo14:wp, sp 08/03 17:57
※ 編輯: uid88 (17.244.72.246), 08/06/2014 07:20:18