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ミューテックスに含まれていても、インナーはその役割を果たしますか?なぜ?

構造を見るだけで、質問に関連するプログラムの一部だけを示しました。

4

1 に答える 1

1

しかし、ifステートメントチェックとは正確には何ですか?

synchronize渡されたブロックが返すものは何でも返すので、ifステートメントは最終的にチェックしshared_var <= my_varます。

そして、この他のコードはどうですか?

ここでの記述が何をチェックしているのかは自明だと思いますifが、それは上記と同じです。

それらは同等ですか?

いいえ。

nextミューテックスに含まれていても、インナーはその役割を果たしますか?

いいえ、これが同等ではない理由です。が呼び出しのブロックnextで呼び出されると、そのブロック(ではなく)で呼び出されます。これは、「次」がないため、ここと同等です。それがそのブロックの外側にあるとき、それはあなたが期待する実際の外側のブロック( )の上にあります。synchronizenextforeachreturnnextforeach

したがって、最初のコードブロックが必要になる可能性があります。

于 2012-06-15T02:42:20.790 に答える