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"
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
ない例(例えば、 Before
とAfter
が1
以上異なる場合の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