1
我的過程有兩個線程像下面紅寶石線程同步
@semaphore = Mutex.new
.
.
.
.
thread_a = Thread.new {
loop do
#some work
if(some_condition)
@semaphore.synchronize {
@thread_b_running = false
}
end
end
}
thread_b = Thread.new {
while(@semaphore.synchronize { @thread_b_running }) do
#thread_b's work
end
}
thread_a.join
thread_b.join
基本上thread_a
和thread_b
做並行了一些工作,但是當thread_a
看到一個事件發生,它需要關閉thread_b
。正如你現在所看到的,我正在通過使用由互斥鎖保護的布爾值來實現它。我認爲這種方法不是太糟糕的性能明智,因爲thread_b
將幾乎總是沒有等待它的鎖。然而,由於我沒有寫出很多多線程代碼,我想知道是否有更好的方式來做我正在做的事情?
我想過,但不會造成問題,因爲寫入變量不是原子操作?如果thread_a從CPU中移除thread_b時,如果thread_a部分通過寫入該變量會得到預定嗎? – Wooser990
@ Wooser990糾正我,如果我錯了,但寫入變量是一個原子操作(引文需要)。即使不是,由於它是一個布爾值,在最糟糕的情況下,thread_b將再次運行 - 在線程B開始運行之前,同樣的情況將'thread_b_running'更改爲true。正確? – fotanus
寫入變量不是原子操作http://moonbase.rydia.net/mental/blog/programming/atomic-operations-in-ruby.html。然而,你說得對,在我的情況下,最壞的情況是thread_b代碼運行一個額外的迭代(在我的情況下是可以接受的)。我已經接受你的回答 – Wooser990