【问题标题】:What is the "Hello World" of concurrent programs?并发程序的“Hello World”是什么?
【发布时间】:2011-10-07 02:40:27
【问题描述】:

我正在寻找一些规范的、简单的并发问题,适合演示我正在处理的并发计算库的用法。

澄清我所说的“并发”是什么意思:我对利用非确定性通信过程的算法感兴趣,而不是例如通过将工作分散到多个处理器上,使快速排序等算法运行得更快。 This 是我使用这个词的方式。

我知道Dining Philosophers Problem,这是可以接受的,但我想知道是否还有更令人信服但同样简单的问题。

【问题讨论】:

    标签: algorithm language-agnostic concurrency


    【解决方案1】:

    Producer-Consumer 问题。

    【讨论】:

      【解决方案2】:

      我一般使用简单的“银行账户转账”场景。例如,我在this question on transactions 中发布了一个这样的琐碎案例。

      这是一个很好的展示案例,因为:

      • 每个人都了解业务问题。
      • 它强调了事务在并发环境中的重要性。
      • 您可以轻松扩展该场景(例如,如果您想在交易发生时计算所有当前账户余额的总和怎么办?)

      为了演示您的并发库,您可能可以在这种情况下启动一个运行数百万事务的线程,并演示其他线程如何仍然可以看到一致的世界视图等。

      【讨论】:

      • 谢谢!虽然有点干,但我认为这是迄今为止最好的答案。
      【解决方案3】:

      我认为没有标准的第一个程序来证明并发正在工作,例如用于顺序程序的“Hello world”。

      更典型的并发是显示问题的程序,例如在没有正确同步的情况下丢失一些计数的并发计数器。或者如果天真地完成锁定,银行账户之间的随机转账会导致死锁。 (我在玩 Java 并发时做了这些。)

      展示并发性并且相对简单的一件事是协同计数:并发线程(或其他)有一个内部计数器,它们相互发送,并设置为它们接收到的加一。 (几年前,我用三个 LEGO Mindstorms RCX 通过红外线做到了这一点,效果很好。)

      顺便说一句:嵌入式编程器的“Hello world”是闪烁的 LED。

      【讨论】:

      • 特别是如果你让它在莫尔斯语中闪烁“HELLO WORLD”。
      【解决方案4】:

      曾经有一个示例 Java 小程序(很可能仍然存在),用于测试 JVM 和底层操作系统使用的调度算法。它动画了两个(或者更多?不记得了)逐渐填满的条,每个条由具有相同优先级的不同线程动画。

      打印的等价物:

      red 1
      red 2
      green 1
      red 3
      green 2
      

      等到控制台,在我看来,它在精神上最接近“你好,世界”的本质。也就是说,“我可以让计算机做一些无用但可见的事情吗?”

      因此,在每个线程中,您需要一系列暂停(忙循环或睡眠,取决于您,您选择的可能会影响输出,具体取决于您的并发安排方式),每个暂停后都有一些输出。您可能想要同步输出——这不是必需的,但如果调度程序将一行拆分,则阅读起来会很尴尬。

      然后,如果您的并发模型是协作的(新石器时代的线程,或者可能是基于协程的东西),您还必须添加合适的产量,以防止在绿条开始之前红条填充。这告诉你你已经成功地让你的并发代码交错了。

      【讨论】:

        【解决方案5】:

        您可以在单独的线程中对“Hello”和“World”进行光线追踪。 或者在“World”进行光线追踪时为“Hello”设置动画。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-09-12
          • 1970-01-01
          • 1970-01-01
          • 2011-09-09
          • 1970-01-01
          • 2011-02-01
          • 2017-06-14
          相关资源
          最近更新 更多