2014-02-24 2 views
2

스칼라에서 블로킹 및 동기화 된 큐를 구현해야합니다. 이 수,스칼라 블로킹 큐, 적절한 대기

def pop() : T = { 
    this.synchronized 
    { 
     _read() 
     if(_out.isEmpty) throw new Empty() 
     val ret = _out.head 
     _out = _out.tail 
     _length -= 1 
     return ret 
    } 
} 

def waitPop() : T = 
{ 

    var ret : Option[T] = None 

    // Possibly wait forever 
    while(ret.isEmpty) 
    { 
     try { ret = Some(pop) } 
     catch { case e : Empty => Thread.sleep(1000) } 
    } 

    ret.get 
} 

문제는 여기 Thread.sleep입니다 : 내가 뭔가를 놓치지 않는 경우

, 동기화는 매우 간단하지만, 난 단지 (작동하는) 것을 생각할 수 차단 내 큐가 될 수 있도록 성능을 손상시키지 않습니까? 물론 더 낮은 값을 지정하면 CPU를 더 많이 소비하게됩니다. 제대로 대기 할 수있는 방법이 있습니까?

감사합니다. 푸시, 내가 (A synchronized 블록에 계속) notifyAll 추가

def waitPop() : T = 
{ 
    this.synchronized 
    { 
     while(isEmpty) wait 

     pop 
    } 
} 

동안 : Voo에

+0

나는 https://stackoverflow.com/questions/1107593/what-are-trade-offs-for-busy-wait-vs-sleep 에서 살펴 봤지만, 제 경우에는 스케줄러가 알지 못합니다. 내가 기다리는 것은 그것을합니까? –

+1

'Object.wait'와'Object.notify'를 사용하고 싶습니다. – Voo

+0

고마워요, 그게 내가 찾고 있던 것입니다 (나는 그 모든 미래와 모든 것을 가지고 어려움을 겪었습니다). 감사합니다. –

답변

1

덕분에, 나는 내가 필요한 것을 얻었다. notify도 작동했지만 notifyAll으로 결과가 덜 결정적으로 나타납니다.

고맙습니다.

+0

스택의 크기를 제한하기 때문에'push'를 막을 수 있다면'notifyAll'이 필요합니다. 그렇지 않으면'notify'가 좀 더 효율적이어야합니다. 그렇지 않으면 오직 하나만 작업을 할 수 있지만 모든 스레드를 깨울 수 있기 때문입니다. 'notfiy'는 일부 상황에서 유용 할 수있는 그래도 공정성을 보장하지 않습니다. – Voo

+0

뭔가를 덜 결정적으로 만들 필요가 있기 때문에 나는 또한 이것을 추가했다. (왜 추측하는지는 중요하지 않다.)'notify'와 함께, 모든 스레드는 내가 시작한 바로 그 순서대로 큐에서 요소를 얻는다. . –