2010-06-22 24 views
6

當面試畢業生時,我通常會問他們關於數據結構,算法和複雜性理論的問題。我真的很想問一個問題,使他們能夠顯示他們對多線程概念的熟悉程度,而不會陷入語言特定的問題。任何好的主題相關的工作面試問題?

有什麼好的問題嗎?我能想到的唯一問題是如何編寫支持多線程訪問的Singleton。

+0

男人,我在面試時失敗了,因爲我不打擾鎖等等。使用一種專爲理智併發而設計的語言有其優勢。 – 2010-06-22 08:39:37

回答

3

我發現經典的「給我寫一個消費者 - 生產者隊列」的問題很好。您可以事先約5分鐘左右以手動方式談論同步(例如,從「Object.wait()做什麼?Object有什麼其他方法與它有關?您能給我一個什麼時候可以使用它們的例子嗎?可能在實踐中使用併發技術[因爲實際上,實際使用wait/notify原語是最好的方法]「)。確保候選人的地址(或至少明確他知道)原子性(「錯過的更新」)和波動性(在其他線程上的新值的可見性)

然後,這些理論,讓他們花幾分鐘時間爲原始的生產者 - 消費者隊列編寫代碼。對於那些真正理解他們上面所談論的內容的人來說,這應該是直截了當的,但是它會清除那些可以「講話」但實際上並沒有在實踐中理解它的人(可以說是最危險的羣體)。

我喜歡這些迷你編碼練習,它們通常很容易擴展。例如,如果候選人可以輕鬆完成任務,則可以詢問他們如何將其擴展到情境XXX--發明需求,您知道這些要求會推動您要求的解決方案的限制。這不僅可以讓您調整問題的深度,還可以深入瞭解候選人如何處理要求的澄清以及現有設計的修改(這在該行業中非常重要)。

1

在這裏你可以找到一些話題討論:

  • 線程執行(內核VS用戶空間)
  • 線程本地存儲
  • 同步原語
  • 死鎖,活鎖
1
    互斥之間的區別
  • 互斥與之間的區別信號量。
  • 使用條件變量。
  • 何時不使用線程。 (例如IO多路複用)
1

與他們討論一個流行的,但不是衆所周知的話題,其中線程處理是必不可少的。

我建議你,建立一個網絡服務器與他們,當然,只有在紙上或只是在文字。結果應該看起來像這樣:有一個主線程,它在套接字上偵聽。當有東西到達時,它將套接字傳遞到池中,然後此線程返回到套接字偵聽。池具有固定數量的插槽。請求處理線程專用於從池中獲取作業。發現,如果線程正在同時檢查池,或者列表程序主線程爲新的傳入請求選擇空閒插槽/線程,那麼更好。嘗試編寫一個小的僞代碼,或者對池的兩端進行處理。

讓我們來介紹一個小應用程序:頁計數器,它告訴服務器啓動後有多少頁請求。不要告訴他們必須保護計數器免受併發修改,讓他們找出如何使用互斥鎖或同步或任何方式來執行此操作。也許你可以跳過Web服務器部分,頁面計數器應用程序更容易指定。

另一個例子是一個聊天,與2+客戶端和服務器,找出,如何解決這個問題,所有的消息應該以相同的順序到達所有客戶端。或反射遊戲:服務器隨機等待1..5秒,然後說「偷看」,並且玩家贏得誰先按下空格鍵。用2名玩家指定它,然後嘗試將其擴展到N個玩家。


另外,請注意核電廠。 NPP代表:「非編程程序員」。有些人可以談論編程問題,他們知道所有3/4字母的縮寫(在Java世界中有lot,EJB,JSP,XSLT和我的最愛:POJO,這意味着Pure Old Java對象,大聲笑),他們理解和修改代碼,或從基地製作類似的程序,但即使遇到小問題也會失敗,它必須自行完成,例如查找數組中最近的元素。有時需要幾個月,直到它結果。他們在面試中表現良好,因爲他們爲此做好準備。也許他們甚至不知道,他們是核電站,這是一個已知的效果:http://en.wikipedia.org/wiki/Dunning-Kruger_effect

很難識別對面的傢伙,誰也沒有聽說過時尚的圖書館或模式,但他們甚至可以學習它,甚至在面試。 (個人評論:我最後一次訪談是在1999年,看起來我不會再採訪了,我以前從來沒有聽說過動態網頁,但我在訪談中已經弄清了「會話」這個詞,問題是我被錄用了)