2013-08-31 116 views
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_athread_b做並行了一些工作,但是當thread_a看到一個事件發生,它需要關閉thread_b。正如你現在所看到的,我正在通過使用由互斥鎖保護的布爾值來實現它。我認爲這種方法不是太糟糕的性能明智,因爲thread_b將幾乎總是沒有等待它的鎖。然而,由於我沒有寫出很多多線程代碼,我想知道是否有更好的方式來做我正在做的事情?

回答

0

如果只有一個線程正在寫入變量,則不需要互斥鎖。因此,在您的示例中更好的方法是刪除互斥鎖。

+0

我想過,但不會造成問題,因爲寫入變量不是原子操作?如果thread_a從CPU中移除thread_b時,如果thread_a部分通過寫入該變量會得到預定嗎? – Wooser990

+0

@ Wooser990糾正我,如果我錯了,但寫入變量是一個原子操作(引文需要)。即使不是,由於它是一個布爾值,在最糟糕的情況下,thread_b將再次運行 - 在線程B開始運行之前,同樣的情況將'thread_b_running'更改爲true。正確? – fotanus

+1

寫入變量不是原子操作http://moonbase.rydia.net/mental/blog/programming/atomic-operations-in-ruby.html。然而,你說得對,在我的情況下,最壞的情況是thread_b代碼運行一個額外的迭代(在我的情況下是可以接受的)。我已經接受你的回答 – Wooser990