수색…


기본 스레드 의미론

주 스레드의 실행과는 별도로 새 스레드를 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 없는 예 (예 : BeforeAfter1 이상 차이가 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