2016-12-01 7 views
0

私はGPARSを使用して計算を並列化し、コール全体でブール値「And」を計算しようとしました。このメソッドはデータフローとして結果を返す@ActiveObjectとしてラップされています。以下のコードはAtomicBooleanを使用して集約を保存しようとしていた独自のアプローチです。AtomicBooleanの並列バージョンは機能しません - エージェントバージョンは

これは計算された「終わりの真実」のために、これは失敗しました。これを修正するには、私はAtomicBooleanからAgent(boolean)アプローチに変更しました。私はその「固定」と思っています。少なくとも、私のスポークテストは継続的に成功しています。

最終的な結果を構築するためにAtomicBooleanを使用しようとすると、私のロジックが埋まっていたところを指摘できます。それはうまくいくはずだと感じました - しかし、なぜそれは理解できません。私は学びながら、ガイダンスは有用であろう

以下

方法 - 私は、元のバージョンを入れて、この

@ActiveMethod 
def evaluateAllAsync() { 
    def result = new Agent (true) 
    GParsPool.withPool { 
     // do as parallel 
     conditions.eachParallel { condition -> 
      println "evalAllAsync-parallel intermediate result start value is ${result.val} and condition with expression ${condition.expression} evaluated to ${condition.evaluate()}" 
      result << { def res = it && condition.evaluate(); println "start> $it and finish> $res"; updateValue(res)} 
      println "recalc bool value is now ${result.val}" 
     } 
    } 
    println "evalAllAsync-parallel final result value is ${result.val}" 
    result.val 

} 

のようなエージェントのフォームを使用して

@ActiveMethod 
def evaluateAllAsync() { 
    AtomicBoolean result = new AtomicBoolean(true) 
    GParsPool.withPool { 
     // do as parallel 
     conditions.eachParallel { condition -> 
      println "evalAllAsync-parallel intermediate result start value is ${result.get()} and condition with expression ${condition.expression} evaluated to ${condition.evaluate()}" 
      result.getAndSet(result.get() && condition.evaluate()) 
      println "recalc bool value is now ${result.get()}" 
     } 
    } 
    println "evalAllAsync-parallel final result value is ${result.get()}" 
    result.get() 

} 

固定問題以下の修正バージョンきた私デバッグprintlnをここに入れるだけで、どのようなコードが実行されているかを確認できます

bool集計値を保護するエージェントのバージョンは正常に動作しているようです

は本当によく、これはあなたがAtomicBooleanを使用する方法に問題が事前

答えて

0

で感謝している、アトミックブールが動作しない理由を知ってお願い申し上げます。現在のスレッドが評価中である間に他のスレッドがそれを変更している可能性を無視して、常に強制的に(getAndSet())上書きします。

あなたはおそらく代わりのcompareAndSet()メソッドを使用していた:

def valueToUse = result.get() 
    result.compareAndSet(valueToUse, valueToUse && condition.evaluate()) 
+0

私はgetAndSet自体がアトミックであると仮定したので、他のスレッドからの干渉を受けずにその更新を行いますthatsのためだと思います。内部は保証されているので、評価では&&と評価してから、それを設定します。したがって、これらの2つがどのように動作するかについての私の仮定(get && evalを評価してからgetAndSetに提示します) –

+0

しかし、それは明らかに何が起こっているのかわかりません - 私は私のコンソールのプリントを見て、すべてが本当に戻ってくるのを見て、evalauated get && evalは真/偽を期待通りにプリントします。実際には、時には偽を示している - これは、プールの閉鎖で起こっていたように - 私は最終的な正しい計算を参照してください最終的な計算 –

+0

私の非ブロックの理解と競合状態が起こっている方法は正しくない私は以前のアップデートを上書きしていますので、send updateがfalseになっても、3回目のupdate calcで置き換えられました - 次に上書きされます。正しい価値のタルト。コンソールは彼らがすべて真で始まると言っている。 –

関連する問題