Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Concurrency 在Clojure,通勤和改变有什么区别?_Concurrency_Clojure_Transactions_Stm - Fatal编程技术网

Concurrency 在Clojure,通勤和改变有什么区别?

Concurrency 在Clojure,通勤和改变有什么区别?,concurrency,clojure,transactions,stm,Concurrency,Clojure,Transactions,Stm,我试图编写非常简单的代码,在Clojure中显示通勤和改变之间的不同结果。有人能为这一目的创建一个例子吗 理解差异越简单越好。假设正确使用了通勤,则REF的观察值应该没有差异,除非使用通勤可能有助于事务在高争用情况下提交,而在这种情况下,使用alter很难做到这一点。当然,当这适用时,结果会有相当大的差异 使用副作用更容易准确地说明事物的不同之处。这里有一个单线程示例来说明 alter将在每次“事务尝试”中准确调用一次(可能仅调用一次) comment将在每次“事务尝试”中准确调用一次(虽然c

我试图编写非常简单的代码,在Clojure中显示通勤和改变之间的不同结果。有人能为这一目的创建一个例子吗


理解差异越简单越好。

假设正确使用了
通勤
,则REF的观察值应该没有差异,除非使用
通勤
可能有助于事务在高争用情况下提交,而在这种情况下,使用
alter
很难做到这一点。当然,当这适用时,结果会有相当大的差异

使用副作用更容易准确地说明事物的不同之处。这里有一个单线程示例来说明

  • alter
    将在每次“事务尝试”中准确调用一次(可能仅调用一次)

  • comment
    将在每次“事务尝试”中准确调用一次(虽然
    comment
    不会导致它们,但如果在同一
    dosync
    块中使用
    alter
    ,则可能涉及重试),然后最后一次计算提交的值(因此,至少两次,尽管如此,它本身不会导致重试):




使用一些
Thread/sleep
s和少量线程,可以在
alter
端引发更多的重试,同时观察
通勤
端的两次重试,调查使用其中一次或另一次对参考历史的影响,等等。

我不认为这是离题的。这是在问一个例子,但也可以我同意这是一个有效且不明显重复的问题。没有简单的答案出现在脑海中,因为他们总是给出相同的答案,只是在不同的时间内,有时会这样做。
user=> (def r (ref nil))
#'user/r
user=> (dosync (alter r prn))
nil
nil
user=> (dosync (commute r prn))
nil
nil
nil