2012-06-15 57 views
1

我需要評估一個if條件,但我需要小心其他線程可能對變量進行的修改。如果在互斥塊上聲明

我的解決辦法是

array.each do |anything| 
    if (mutex.synchronize do shared_var <= my_var end) 
     next 
    end 
end 

看來工作。但是if聲明檢查的是什麼?那這個其他代碼呢?

array.each do |anything| 
    mutex.synchronize do 
     if shared_var <= my_var 
      next 
     end 
    end 
end 

它們是否等同?內部next即使包含在互斥體中也能完成其工作嗎?爲什麼?

只看結構,我只顯示了與我的問題相關的程序部分。

+0

你究竟想要「下一個」? –

+0

@AndrewMarshall,你說得對,現在還不清楚。有一個外部循環包裝了一切。我編輯這個問題,謝謝 – stackovergio

+0

你知道Array沒有'foreach'方法,對嗎? –

回答

1

但是if語句檢查的確切內容是什麼?

synchronize返回任何傳遞給它的塊返回,所以if聲明最終檢查shared_var <= my_var

那麼這個其他的代碼呢?

我認爲這是if聲明這裏檢查什麼,它是不言而喻的,它與上述相同。

它們是否等同?

是否內next完成自己的工作,即使它被包含在一個互斥?

不,這就是它們不相同的原因。當next在內部調用synchronize調用的塊時,它在該塊(而不是foreach)中爲next,這在這裏等於return,因爲沒有「下一個」。當它是外部的該塊時,它的next在您期望的實際外部塊(foreach)上。

因此,您可能需要第一個代碼塊。