2011-12-02 2 views
0

백그라운드에서 작업을 수행하는 스레드가 있고 프로그램에 실제 작업이있을 때마다 일시 중지하려고합니다. 끝나면 백그라운드 스레드를 계속 진행합니다. 예 :외부에서 스레드를 중지하십시오.

ta = Thread.new { loop { print 'a'; sleep 0.2 } } 

sleep 0.5 

# put ta to sleep 
5.times { print 'b'; sleep 0.2 } 
# let ta resume 

sleep 0.8 
puts 

출력은 aaabbbbbaaaaa과 같아야합니다. 현재는 aaabababababaaaaa입니다.

스레드가 Thread.stop을 통해 자체를 중지 할 수 있지만 스레드를 "외부"에서 중지하는 방법이 없습니다. 간단한 해결책이 있습니까? 당신이 필요로하는 무엇

+1

나는 몇 가지 조사를했고, 나는 (은'Thread' 클래스에서 아무것도 발견하지 않았습니다 당신 자신, I를 않았다 취하다). '# ruby' : JonnieCache : 잠금 장치/세마포어 등이 필요합니다. 고통에 대비하십시오. https://github.com/igrigorik/agent – Reactormonk

답변

2

이있는 Mutex :

$my_mutex = Mutex.new 

t1 = Thread.new do 
    loop do 
    $my_mutex.synchronize do 
     print 'a' 
    end 
    sleep 0.2 
    end 
end 

sleep 0.5 

$my_mutex.synchronize do 
    5.times do 
    print 'b' 
    sleep 0.2 
    end 
end 

sleep 0.8 

puts 
sleep 

출력 :

aaabbbbbaaaaa 
aaaaaaaaaaaaaaaaa... 
+0

감사합니다.이 방법이 유용 할 것입니다. 그러나 제한되어야 할 점은 중지해야 할 스레드가 협조적이고 정기적으로 뮤텍스를 해제/재 확보해야한다는 것입니다. 나는 멈추도록 강요 할 것을 기대하고있었습니다. –

관련 문제