Ruby Language
실
수색…
기본 스레드 의미론
주 스레드의 실행과는 별도로 새 스레드를 Thread.new
사용하여 만들 수 있습니다.
thr = Thread.new {
sleep 1 # 1 second sleep of sub thread
puts "Whats the big deal"
}
이렇게하면 새 스레드의 실행이 자동으로 시작됩니다.
메인 쓰레드의 실행을 멈추기 위해서 새로운 쓰레드가 멈출 때까지 join
사용하라 :
thr.join #=> ... "Whats the big deal"
조인을 호출 할 때 스레드가 이미 완료되었을 수 있으므로 실행이 정상적으로 계속됩니다. 하위 스레드가 절대 결합되지 않고 주 스레드가 완료되면 하위 스레드는 나머지 코드를 실행하지 않습니다.
공유 리소스 액세스
뮤텍스를 사용하여 여러 스레드에서 액세스하는 변수에 대한 액세스를 동기화하십시오.
counter = 0
counter_mutex = Mutex.new
# Start three parallel threads and increment counter
3.times.map do |index|
Thread.new do
counter_mutex.synchronize { counter += 1 }
end
end.each(&:join) # Wait for all threads to finish before killing the process
그렇지 않으면 한 스레드에서 현재 볼 수있는 counter
의 값을 다른 스레드가 변경할 수 있습니다.
Mutex
없는 예 (예 : Before
과 After
가 1
이상 차이가 Mutex
Thread 0
참조) :
2.2.0 :224 > counter = 0; 3.times.map { |i| Thread.new { puts "[Thread #{i}] Before: #{counter}"; counter += 1; puts "[Thread #{i}] After: #{counter}"; } }.each(&:join)
[Thread 2] Before: 0
[Thread 0] Before: 0
[Thread 0] After: 2
[Thread 1] Before: 0
[Thread 1] After: 3
[Thread 2] After: 1
예는 Mutex
:
2.2.0 :226 > mutex = Mutex.new; counter = 0; 3.times.map { |i| Thread.new { mutex.synchronize { puts "[Thread #{i}] Before: #{counter}"; counter += 1; puts "[Thread #{i}] After: #{counter}"; } } }.each(&:join)
[Thread 2] Before: 0
[Thread 2] After: 1
[Thread 1] Before: 1
[Thread 1] After: 2
[Thread 0] Before: 2
[Thread 0] After: 3
스레드를 죽이는 방법
당신은 Thread.kill
또는 Thread.terminate
사용하여 호출합니다 :
thr = Thread.new { ... }
Thread.kill(thr)
스레드 종료
스레드가 코드 블록의 끝에 도달하면 스레드가 종료됩니다. 스레드를 조기에 종료하는 가장 좋은 방법은 코드 블록의 끝에 도달하도록 설득하는 것입니다. 이렇게하면 스레드가 죽기 전에 정리 코드를 실행할 수 있습니다.
이 스레드는 인스턴스 변수 continue가 true 인 동안 루프를 실행합니다. 이 변수를 false로 설정하면 스레드가 자연스럽게 죽을 것입니다.
require 'thread'
class CounterThread < Thread
def initialize
@count = 0
@continue = true
super do
@count += 1 while @continue
puts "I counted up to #{@count} before I was cruelly stopped."
end
end
def stop
@continue = false
end
end
counter = CounterThread.new
sleep 2
counter.stop
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow