作者frouscy (流浪吧。)
看板Soft_Job
標題Re: [心得] agoda senior SWE (data engineering)
時間Tue Apr 18 12:11:35 2017
有人來信討論最後一題,
我來說明一下當初在面試官邊半提示半猜之後得到的答案和想法
題目基本上在問的是:
有一個變數x,初始值是0
同時開五個thread, 五個thread同時做x = x + 1
那最後五個thread都跑完之後,x的可能最大值與可能最小值是什麼
※ 引述《frouscy (流浪吧。)》之銘言:
: - 請回答下面的code裡面,x可能的最大值和最小值是什麼:
: x = 0 # global variable
: # thread execution function
: def exec():
: for _ in xrange(5):
: x = x + 1
: # main function
: def main:
: for _ in xrange(5):
: # launch 5 threads and run the exec function
: Thread.run(exec())
為免防雷,答案請page down
ANS: 最小值2,最大值25
解答再防雷XD。
SOLUTION:
25我想很容易理解,
下面解釋一下2是怎麼來的
其實要理解這個2並不需要5個thread, 只要看兩個thread就足夠了
以下T1代表第一個Thread,T2代表第二個Thread
r0代表從x讀0進來,w1代表寫1到x裡面去
T1 r0
T2 r0
T1 w1
T1 r1
T1 w2
T1 r2
T1 w3
T1 r3
T1 w4
T2 w1
T1 r1
T2 r1
T2 w2
T2 r2
T2 w3
T2 r3
T2 w4
T2 r4
T2 w5
T1 w2
這樣最後就會得到最小值2
如果Thread在兩個以上的話,
其他幾個thread就是隨便在T1 r1到T1w2之間隨便亂做
結果都不會被影響到
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.130.162.20
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Soft_Job/M.1492488698.A.4F3.html
1F:→ robler: cool 我本來猜5 04/18 12:29
2F:推 maxqq: 有道理,兩條以上可能會發生最小的情形 04/18 13:02
3F:→ doomleika: 不是25? Python的global intepreter lock應該會避免這 04/18 13:57
4F:→ doomleika: 種情況 04/18 13:57
5F:→ frouscy: 考官當時有說這是psuedo code, 只是用python語法而已 04/18 14:15
6F:→ Chikei: python也只有CPython有GIL XD 04/18 14:16
7F:→ frouscy: 要問的就是我中文描述的,就不用用語言特性想了 04/18 14:18
8F:推 doomleika: ok thanks 04/18 14:38
9F:推 lininu: 沒想過他讀出來的時候會被另一個已經讀出來的寫回去… 04/18 19:15
10F:→ mike7689: 我看不太懂題目,是一個thread做5次X=X+1嗎? 04/19 07:38
11F:推 sorryla: 5個thread 每個thread做五次 04/19 08:45
12F:→ doomleika: 樓上正解 04/19 10:10
13F:→ mike7689: 了解了 我還在想為何max是25 原來是這樣啊 04/19 10:57