2016-05-03 7 views
2

私は原子に含まれているデータ構造を持っていると私はまずそれの要素を選択し、この要素を更新したいと思います。単一のスワップ内で両方の操作を行うことができますが、競合状態やその他の不快な点に関しては正しいですが、並行性はあまりありません。より良い解決策はありますか?安全な並行性を犠牲にすることなく、アトム内の要素を選択して更新します。

次の例では、検索された値が定期的に(50msごとに)変更されるため、スワップが必要なためコードが大幅に遅くなります。ロールバックする。 The

(swap! myAtom 
    (fn [atom-state] 
     (let [lookedUp (searchValIn atom-state)] ;This slows down the code 
      (if (*some condition*) 
       lookedUp 
       (modify lookedUp))))) 

つまり、安全な並行性を犠牲にすることなく要素の選択と更新を分割したいと考えています。

+0

更新を実行する条件について詳しく教えてください。 –

+0

アトムが頻繁に変化している場合、looksUp値はすぐに無効になります。だから質問は多分:それが無効になったらどうなるのですか?計算を再実行して再試行しますか?その場合は、コードが最適です。しかし、原子を更新している別のスレッドが無効になったことを発見したら、中止したい場合は、より良い選択肢があるかもしれません。 –

答えて

2

私が理解する限り、それはできません。データの一貫したビューを維持するためには、単一の "トランザクション"(引用符で囲まれたtransactionの用語はアトム操作にはあまり適さないため)の中でルックアップと更新を実行する必要があります。

関連する問題