什么是并发程序的“Hello World”?

时间:2011-10-07 02:40:27

标签: algorithm language-agnostic concurrency

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

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

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

5 个答案:

答案 0 :(得分:13)

答案 1 :(得分:6)

我通常使用简单的“银行转帐”方案。例如,我在this question on transactions中发布了一个这样简单的案例。

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

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

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

答案 2 :(得分:3)

我认为没有一个标准的第一个程序可以证明并发是有效的,就像顺序程序的“Hello world”一样。

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

证明并发性并且相对简单的一件事是合作计数:并发线程(或其他)有一个内部计数器,它们彼此发送,并设置为他们收到的加一个。 (几年前,我用三个LEGO Mindstorms RCX红外线做过,效果很好。)

BTW:嵌入式编程器的“Hello world”是闪烁的LED。

答案 3 :(得分:3)

曾经有一个示例Java applet(很可能仍然是),您用它来测试JVM和底层操作系统使用的调度算法。它动画两个(或者可选择更多?不记得)条形逐渐填满,每个条形图由相同优先级的不同线程激活。

打印的等效物:

red 1
red 2
green 1
red 3
green 2
对于控制台而言,在我看来,对于“你好,世界”的裸骨性质来说,这是我最接近的事情。也就是说,“我可以让计算机做一些无用但可见的事情吗?”

因此,在每个线程中,您需要一系列暂停(忙碌循环或睡眠,由您决定,您选择的可能会影响输出,具体取决于您的并发计划),每个后跟一些输出。您可能希望同步输出 - 这不是必需的,但如果调度程序要拆分某行,则读取起来会很麻烦。

然后,如果您的并发模型是合作的(无论是新石器线程,还是基于协同常规的线程),您还必须添加合适的产量,以防止在绿条开始之前填充红条。这告诉您,您已成功地使并发代码交错。

答案 4 :(得分:1)

您可以在单独的线程中对“Hello”和“World”进行光线追踪。 或者在“世界”是光线追踪时动画“你好”。