并发和多线程

Luc*_*eis 14 concurrency multithreading process

我对并发和多线程等主题不太熟悉.事实上,在我的大部分网络开发生涯中,我从未需要触及这些主题.

我觉得这是一个重要的概念,特别是对于桌面应用程序,基本上任何其他不生成HTML的应用程序:).

在阅读了并发性的一点后,似乎在Go(谷歌编程语言)这样的语言中得到了更好的支持,我不太明白为什么语言在并发等概念上比其他语言更好,因为它基本上是关于能够fork()并行处理和计算东西,对吧?编程是如何工作的?

多线程似乎是并发的一个分支,因为它允许您在同一进程下并行运行事物,尽管它似乎是特定于平台的如何实现它.

我想我的问题是,为什么特定语言在并发性方面比其他语言更好?为什么fork()进程是一个更好的解决方案而不仅仅是使用线程?

Aar*_*ght 28

好吧,有一件事,多个线程与多个进程不同,所以fork()实际上并不适用于此.

多线程/并行处理很难.首先,您必须弄清楚如何实际划分要完成的任务.然后,您必须协调所有并行位,这些位可能需要相互通信或共享资源.然后,您需要合并结果,在某些情况下,结果可能与前两个步骤一样困难.我在这里简化了,但希望你能得到这个想法.

所以你的问题是,为什么有些语言会更好?好吧,有几件事可以让它变得更容易:

  • 优化的不可变数据结构.您希望在并行处理中尽可能坚持不可变结构,因为它们更容易推理.有些语言对这些语言有更好的支持,有些语言有各种优化,即能够在没有任何实际复制的情况下将集合拼接在一起,同时仍然强制执行不变性.您可以随时构建自己的结构,但如果语言或框架为您完成,则会更容易.

  • 同步原语和使用它们的便利性.当不同的线程共享状态时,它们需要同步,并且有许多不同的方法来实现这一点.您获得的同步原语数组越宽,您的任务最终将越容易.如果您必须与关键部分而不是读写器锁定同步,性能将受到影响.

  • 原子交易.甚至比多种同步原语更好也不必使用它们.数据库引擎非常擅长这一点; 而不是你,程序员,必须弄清楚你需要锁定哪些资源以及何时以及如何,你只需对编译器或解释器说,"这条线下面的所有东西都需要一起发生,所以确保没有其他人当我使用它时,它会被它弄乱." 引擎会为你找出锁定.你几乎从来没有在抽象编程语言中获得这种简单性,但你越接近越好.将多个常见操作合并为一个的线程安全对象是一个开始.

  • 自动并行.假设您必须遍历一长串项目并以某种方式对其进行转换,例如乘以50,000个10x10矩阵.如果你能告诉编译器,那不是很好吗:嘿,每个操作都可以独立完成,所以每个操作都使用一个单独的CPU核心? 无需自己实际执行线程?有些语言支持这种事情; 例如,.NET团队一直致力于PLINQ.

这些只是一些可以使您在并行/多线程应用程序中更轻松的事情的例子.我相信还有更多.

  • +1.无副作用的语言也使事情变得更容易(像Haskell这样的功能性语言). (3认同)