任何人有任何想法Barrier Synchronization
如何在scala內部實施?我猜測它使用的是Semaphores
,但我想知道它的工作原理,有人知道嗎?Scala:Barrier同步是如何實現的?
我想一個天真的想法可能是爲每個進程創建一個Semaphores數組。任何更好/更有效的實現?
任何人有任何想法Barrier Synchronization
如何在scala內部實施?我猜測它使用的是Semaphores
,但我想知道它的工作原理,有人知道嗎?Scala:Barrier同步是如何實現的?
我想一個天真的想法可能是爲每個進程創建一個Semaphores數組。任何更好/更有效的實現?
好的,對不起這個傢伙,我終於找到了。這裏是任何人有興趣的情況。
class Barrier(n:Int){
assert(n>1);
private var waiting = 0; // number of processes currently waiting
private val waitSem = new Semaphore; waitSem.down
private val mutex = new Semaphore;
def sync = {
mutex.down;
if(waiting==n-1){ waitSem.up; }
else{
waiting+=1; mutex.up; waitSem.down;
// Wait until woken
waiting-=1;
if(waiting==0) mutex.up; else waitSem.up;
}
}
}
我會使用兩種java.util.concurrent.CountDownLatch
或java.util.concurrent.CyclicBarrier
。
爲什麼你更喜歡那些以上的實施? – kxk 2011-03-28 15:01:22
@devilwontcry由於三個原因:1)它們是標準接口,因此人們可能事先知道他們做了什麼,而不必去了解; 2)他們有充分的文件記錄; 3)它們經過了很好的測試,很可能沒有bug。例如,您的實現不會在任何地方同步,導致訪問「waiting」時可能出現爭用情況。寫它的方式,有可能「等待」永遠不會到達「n + 1」,也不會返回到「0」。查找CyclicBarrier的源代碼進行比較。 – 2011-03-28 17:24:06
不不不不!我的實現是正確的100%。這就是'互斥體'在那裏的原因。它確保等待自動改變。 – kxk 2011-03-28 17:46:06
當提到計算機科學中的一般術語時,通常將維基百科鏈接或描述該術語的其他權威機構鏈接起來很有幫助。 – 2011-03-28 14:55:09