看板 Soft_Job 關於我們 聯絡資訊
※ 引述《l42857 (~.~)》之銘言: : <恕刪> : 個人認為 : 收一個程式設計人員, 最重要是要看他是"怎麼在coding"的. : 最好的方式, 就是出一些題目. : 讓應試者直接在一台可上網的電腦, 直接寫三~四小時的程式. : 電腦要裝上影像測錄軟體. : 寫完考官先上機驗收, 測試結果, 及應試者溝通能力是否合格. 我覺得直接寫三、四小時確實是太長了 我們通常是一個人分配到45分鐘左右 舉一個前一陣子我在用(不需要背名詞,紙上也可以寫)的具體例子好了 目的: 瞭解在multi-thread上的能力 語言: 任何語言,不需要build,pseudo code也可以。用我不會的語言要教我一下。 題目: 請設計一個程序或機制,不論被叫幾次,裡面的內容只能被執行一次 Code: void func() { printf("Hi.\n"); // This line can be executed only once! } void a() { func(); } void main() { func(); a(); func(); } Output: 只有一行"Hi." 請問要如何改? 知道答案的,請慢一點再公開~~ XD 如果寫出來了,我會慢慢加條件 (然後會被版主踢到C_AND_CPP版 XD) 只要天天有在寫程式,不需要準備,也不需要背東西就可以來寫這題目 面試需要準備是一件很奇怪的事情 公司應該要設計好題目,讓應徵者不需要"準備"才對 我總是覺得這樣才會貼近他平日的實力,而不是準備好的實力... -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 98.234.114.205 ※ 文章網址: http://www.ptt.cc/bbs/Soft_Job/M.1406963436.A.E77.html
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
x000032001:像這樣http://codepad.org/NiR5Z840 08/02 16:04
謝謝特地還寫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
manlike:http://goo.gl/oT8GCl 08/02 16:53
找到的這一篇不錯喔~ 如果能看完看懂,我也會覺得你很強 接下來用它的精神,看看你自己的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