サーチ…


基本スレッドのセマンティクス

メインスレッドの実行とは別の新しいスレッドは、 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"

joinを呼び出すと、Threadがすでに終了している可能性があります。この場合、実行は正常に続行されます。サブスレッドが決して結合されず、メインスレッドが完了すると、サブスレッドは残りのコードを実行しません。

共有リソースへのアクセス

mutexを使用して、複数のスレッドからアクセスされる変数へのアクセスを同期させます。

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以上異なる場合の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