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
Multithreading Clojure,原子和参考文献_Multithreading_Clojure - Fatal编程技术网

Multithreading Clojure,原子和参考文献

Multithreading Clojure,原子和参考文献,multithreading,clojure,Multithreading,Clojure,阅读后,我对参考文献和原子以及clojure参考文献类型有几个问题,主要问题与本书有关 第一: 书中提到了协调,并说协调行动是指多个参与者必须合作才能产生正确的结果。。这是否意味着,如果我有3个fn fn1、fn2和fn3,并且它们中的每一个都执行了一些操作,这些操作可能会改变引用的状态(假设引用发生在每个线程中),那么它在链式操作中以同步方式发生?比如,fn1的输出就是fn2的输入,依此类推 第二: 我无法理解refs和原子之间的区别。这本书说,参考是协调的同步和原子是不协调的同步。每个参考和

阅读后,我对参考文献和原子以及clojure参考文献类型有几个问题,主要问题与本书有关

第一:

书中提到了协调,并说协调行动是指多个参与者必须合作才能产生正确的结果。。这是否意味着,如果我有3个fn fn1、fn2和fn3,并且它们中的每一个都执行了一些操作,这些操作可能会改变引用的状态(假设引用发生在每个线程中),那么它在链式操作中以同步方式发生?比如,fn1的输出就是fn2的输入,依此类推

第二:


我无法理解refs和原子之间的区别。这本书说,参考是协调的同步和原子是不协调的同步。每个参考和原子都有自己的示例,其中原子的使用方式是由多个函数1原子2函数和多个参考1函数操作。这本书没有举例说明为什么我们不应该或不能做相反的事情。

区别真的很容易

REF在类似于数据库事务的事务下运行。想象一个银行系统。您可以将帐户表示为ref。 要转账,您需要通过dosync启动Clojure STM交易。从ref-1中减去X金额,并将该金额添加到ref-2账户。 如果出现问题,Clojure STM将重新启动操作。 假设没有交易。从ref-1中减去X金额,然后在将该金额添加到ref-2之前,您的系统出现了问题。如果你没有被起诉,你的客户将一点也不会高兴

Clojure STM实现为

另一方面,原子不需要一个适当的事务来运行。原子在没有配位时很方便。例如,增加web分析系统中访问页面总数的计数器


看一看。它提供了很多有价值的信息。

区别真的很容易

REF在类似于数据库事务的事务下运行。想象一个银行系统。您可以将帐户表示为ref。 要转账,您需要通过dosync启动Clojure STM交易。从ref-1中减去X金额,并将该金额添加到ref-2账户。 如果出现问题,Clojure STM将重新启动操作。 假设没有交易。从ref-1中减去X金额,然后在将该金额添加到ref-2之前,您的系统出现了问题。如果你没有被起诉,你的客户将一点也不会高兴

Clojure STM实现为

另一方面,原子不需要一个适当的事务来运行。原子在没有配位时很方便。例如,增加web分析系统中访问页面总数的计数器

看一看。它提供了很多有价值的信息

原子允许多个线程对单个值应用转换,并保证转换是原子的。交换获取原子和期望原子当前值的函数。使用当前值调用该函数的结果存储在atom中。多个呼叫交换!可以交错,但每个呼叫将独立运行。 REF允许多个线程以协调的方式更新多个值。对同步内所有引用的所有更新都将完成,或者没有更新。您必须编写代码以满足事务重试的需要。如果您可以放松操作顺序,那么可能会有一些性能调整,这可能会减少事务重试的机会,但不能保证这一点。 原子允许多个线程对单个值应用转换,并保证转换是原子的。交换获取原子和期望原子当前值的函数。使用当前值调用该函数的结果存储在atom中。多个呼叫交换!可以交错,但每个呼叫将独立运行。 REF允许多个线程以协调的方式更新多个值。对同步内所有引用的所有更新都将完成,或者没有更新。您必须编写代码以满足事务重试的需要。如果您可以放松操作顺序,那么可能会有一些性能调整,这可能会减少事务重试的机会,但不能保证这一点。