multithreading - 并发和多线程

标签 multithreading concurrency process

我对并发和多线程等主题不是很有经验。事实上,在我的大部分网络开发生涯中,我从来不需要接触这些主题。

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

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

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

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

最佳答案

一方面,多线程与多进程不同,所以 fork() 在这里确实不适用。

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

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

  • 优化的不可变数据结构。您希望在并行处理中尽可能坚持不可变结构,因为它们更容易推理。有些语言对这些有更好的支持,有些语言有各种优化,即能够在没有任何实际复制的情况下将集合拼接在一起,同时仍然强制执行不变性。你总是可以像这样构建自己的结构,但如果语言或框架为你做这件事会更容易。
  • 同步原语和易用性。当不同的线程确实共享状态时,它们需要同步,并且有许多不同的方法可以实现这一点。您获得的同步原语数组越广泛,您的任务最终就越容易。如果您必须与关键部分而不是读写器锁同步,性能将会受到影响。
  • 原子交易。甚至比大量同步原语更好的是根本不必使用它们。数据库引擎在这方面非常擅长;而不是你,程序员,必须弄清楚你需要锁定哪些资源以及何时以及如何锁定,你只需对编译器或解释器说,“这一行下面的所有东西都需要一起发生,所以确保没有其他人在我使用它的时候把它弄乱了。”引擎会为您解决锁定问题。在抽象编程语言中你几乎永远不会得到这种简单性,但你越接近越好。将多个常见操作组合为一个的线程安全对象是一个开始。
  • 自动并行。假设您必须遍历一长串项目并以某种方式对其进行转换,例如将 50,000 个 10x10 矩阵相乘。如果你能告诉编译器不是很好:嘿,每个操作都可以独立完成,所以为每个操作使用一个单独的 CPU 内核?无需自己实际实现线程?有些语言支持这种东西;例如,.NET 团队一直致力于 PLINQ。

  • 这些只是可以使您在并行/多线程应用程序中的生活更轻松的一些示例。我敢肯定还有很多。

    关于multithreading - 并发和多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1996648/

    相关文章:

    C - 如何正确使用SIGUSR1?

    java - Tyrus 使用每个 websocket 连接多少个线程?

    c# - 传递参数给线程问题

    java - Java SE应用程序上带有C3P0的DEADLOCK

    java - 值可变的并发安全容器的线程安全

    javascript - 是否可以利用跨域 iframe 进行非阻塞计算?

    创建两个具有抢占和优先级的任务

    java - Spring @Async 和同步

    c# - 如何杀死由 cmd.exe 启动的进程

    c# - 监控同名进程,我做错了什么