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_Deadlock_Lock Free - Fatal编程技术网

Concurrency 为什么无锁并发如此重要(在Clojure中)?

Concurrency 为什么无锁并发如此重要(在Clojure中)?,concurrency,clojure,deadlock,lock-free,Concurrency,Clojure,Deadlock,Lock Free,我听说Clojure具有无锁并发性,这很重要 我使用过很多种语言,但没有意识到它们在幕后执行锁定 为什么这在Clojure(或任何具有此功能的语言)中是一个优势?我不能具体谈论Clojure,但是。。。这意味着你不需要等到别人做完某件事后才开始工作。这很好 通常,它是通过不可变类型实现的。如果无法修改任何内容,那么您不必等到其他人处理完后才能访问它。死锁。或者更准确地说,他们的缺乏 大多数语言中最大的问题之一是最终会出现死锁: 该死的调试 很难确定你已经摆脱了 现在没有锁,显然你不会陷入死锁 无

我听说Clojure具有无锁并发性,这很重要

我使用过很多种语言,但没有意识到它们在幕后执行锁定


为什么这在Clojure(或任何具有此功能的语言)中是一个优势?

我不能具体谈论Clojure,但是。。。这意味着你不需要等到别人做完某件事后才开始工作。这很好


通常,它是通过不可变类型实现的。如果无法修改任何内容,那么您不必等到其他人处理完后才能访问它。

死锁。或者更准确地说,他们的缺乏

大多数语言中最大的问题之一是最终会出现死锁:

  • 该死的调试
  • 很难确定你已经摆脱了

  • 现在没有锁,显然你不会陷入死锁

    无锁并发的好处是程序不复杂。在命令式语言中,并发编程依赖于锁,一旦程序变得相当复杂,很难修复的死锁错误就会悄悄出现。

    无锁并发还提供了一个很好的优势,即读者不必等待其他读者。当多个线程将从单个源读取数据时,这尤其有用。您仍然需要在程序中定义数据依赖关系,并明确定义可以安全转换的事务部分。

    STM使您免于死锁和几乎所有livelock事件,尽管它不能使您免于并发故障,但您仍然可以创建事务失败的情况,因为它缺乏维护其历史记录的资源,但重要的是,并发故障将是显式的,只要编写严格顺序的程序(先执行A,然后执行B,然后执行C;完成!)不会出现并发问题,并且语言的并发机制仍然不相关

    当您从“编程练习”程序毕业到现实世界中的东西时,很快您就会遇到解决方案是多线程(或任何可用的并发风格)的问题

    案例:带有GUI的程序。假设您正在编写一个带有拼写检查的编辑器。您希望拼写检查器在后台安静地执行其操作,但希望GUI能够顺利地接受用户输入。因此,您可以将这两个活动作为单独的线程运行

    案例:我最近编写了一个程序(用于工作),它从两个日志文件收集统计数据,并将它们写入数据库。处理每个文件大约需要3分钟。我将这些进程移动到两个并排运行的线程中,将总处理时间从6分钟缩短到3分钟多一点

    案例:科学/工程模拟软件。通过计算代表受试者(恒星核、核爆炸、昆虫种群的地理分布……)的三维网格中每个点上的一些效应(比如热流),可以解决很多问题。基本上,在每个点和许多点上都进行相同的计算,因此并行进行这些计算是有意义的

    在所有这些情况下,以及更多情况下,只要两个计算进程在大致相同的时间访问相同的内存(=变量,如果您愿意),它们就有可能相互干扰,并打乱彼此的工作。计算机科学中处理“并发编程”的巨大分支处理如何解决这类问题的想法

    关于这个主题的一个相当有用的开始讨论可以找到。

    这种“无锁并发”并不是一种语言的真正特征;更确切地说,它是平台或运行时环境的一个特性,而糟糕的是,这种语言不会妨碍您访问这些设施


    思考基于锁和无锁并发之间的权衡类似于元循环计算器问题:可以根据原子操作(例如比较和交换,或CAS)实现锁,也可以根据锁实现原子操作。哪个应该在底部?

    最大的问题是锁不构成

    虽然使用简单的锁定策略编写代码(例如,将其放在同步的Java类中……)很简单,但当您开始锁定多个对象,并开始创建组合不同锁定操作的复杂事务时,代码会变得越来越复杂。死锁可能会发生,性能会受到影响,锁定逻辑开始使代码变得非常复杂,并且在某些时候代码开始变得不可维护

    这些问题对于任何需要构建大型复杂并发系统的人来说都是显而易见的(解决这些问题是Rich Hickey创建Clojure的主要动机)

    第二个问题是性能

    锁定和STM显然都会带来开销。但在某些重要情况下,STM开销可能会低得多


    特别是,无锁并发(与Clojure STM一样)通常意味着,如果读卡器在事务外部访问数据,则读卡器不会受到任何其他线程(包括写卡器!)的影响。这可能是一个巨大的胜利,在相当常见的情况下,读取不需要是事务性的,并且数量大大超过写入(想想大多数web应用程序……)。Clojure中STM引用的非事务性读取基本上是无开销的。

    谁是“某人”?你能举个例子吗?我不认为有人在和我分享我的物品。也许我应该在床下检查一下。有人只是另一段代码,在另一个线程中,访问那个对象。它有时快有时慢——就像大多数没有测量的优化一样。所以有时候这是件好事,有时候那些锁会更好。这就是为什么w