在ElectronicArts面試中提問此問題。打印編號,使用3個線程打印不同範圍
有3個線程。第一個線程打印1到10個數字。第二個線程打印11到20的數字,第三個線程打印21到30.現在所有三個線程都在運行。然而,數字以不規則的順序打印,如1,11,2,21,12等。
如果我想讓數字以排序的順序打印,比如1,2,...我該怎麼處理這些線程?
在ElectronicArts面試中提問此問題。打印編號,使用3個線程打印不同範圍
有3個線程。第一個線程打印1到10個數字。第二個線程打印11到20的數字,第三個線程打印21到30.現在所有三個線程都在運行。然而,數字以不規則的順序打印,如1,11,2,21,12等。
如果我想讓數字以排序的順序打印,比如1,2,...我該怎麼處理這些線程?
也許這是由所有三個線程打印他們的人數應該鎖定,檢查已打印的數字,如果它的編號是準備好要打印,打印和移動,否則解鎖和產量的一個單一的靜態方法。
使用共享對象的條件的螺紋可以暫停上。條件可以是3種狀態之一:0,1,2。條件初始化爲狀態0. 1-10線程與狀態0關聯,11-20一個與狀態1關聯,最後一個線程爲與狀態2相關聯。每個線程啓動時檢查條件並在條件狀態與線程關聯的狀態不同時掛起。一次只允許一個線程運行並打印其範圍。當一個線程打印出它的範圍時,它會增加條件的狀態,喚醒等待它的線程並終止。這應該可以解決問題。
如果線程不允許暫停,然後讓他們代表3個線程的「有序調度」共享對象上輪詢。
另一種方法可能是鏈中的線程:具有第二線程阻塞直到第一終止,而第三個到阻塞,直到第二個被完成。該解決方案無需共享對象,但每個線程都需要知道它的前身
似乎是一個自然的barrier。三個過程,兩個障礙(稱它們爲barrier10
和barrier20
)。
方法1:
Print 1-10
Wait on barrier10
Wait on barrier20
Exit
過程2:
Wait on barrier10
Print 11-20
Wait on barrier20
Exit
方法3:
Wait on barrier10
Wait on barrier20
Print 21-30
Exit
Sleepsort? :)(http://dis.4chan.org/read/prog/1295544154) –
如何同步? – Nobody