我正在尋找一些規範的,簡單的併發問題,適合演示我正在使用的併發計算庫的用法。併發程序的「Hello World」是什麼?
澄清我的意思是「併發」:我對利用非確定性通信過程的算法感興趣,而不是在例如。通過將工作分散在多個處理器上,使快速排序等算法運行得更快。 This是我如何使用該術語。
我知道Dining Philosophers Problem,這是可以接受的,但我想知道是否有更令人信服但同樣簡單的問題。
我正在尋找一些規範的,簡單的併發問題,適合演示我正在使用的併發計算庫的用法。併發程序的「Hello World」是什麼?
澄清我的意思是「併發」:我對利用非確定性通信過程的算法感興趣,而不是在例如。通過將工作分散在多個處理器上,使快速排序等算法運行得更快。 This是我如何使用該術語。
我知道Dining Philosophers Problem,這是可以接受的,但我想知道是否有更令人信服但同樣簡單的問題。
我通常使用一個簡單的「銀行賬戶轉移」方案。例如,我在this question on transactions中發佈了一個這樣的小事例。
這是因爲爲了說明一個很好的例子:
爲了證明你的併發庫,你很可能啓動一個線程運行在這種場景中有數百萬筆交易,並展示其他線程仍然可以看到世界的一致視圖等。
我不認爲有一個標準的第一個程序用於演示併發性的工作,例如順序程序的「Hello world」。
更典型的併發性是程序展示問題,例如併發計數器在沒有正確同步的情況下會丟失一些計數。或者在天真地完成鎖定的情況下導致死鎖的銀行賬戶之間的隨機轉移。 (我在玩Java併發時做過這些事情。)
一件事說明併發性並且相對簡單一點就是合作計數:併發線程(或其他)具有一個內部計數器,並將它們發送給對方,以及設置爲他們收到的加上一個。 (我在幾年前用三個LEGO Mindstorms RCX做過紅外線,效果很好。)
順便說一句:嵌入式程序員的「Hello world」是閃爍的LED。
特別是如果你讓它在莫爾斯閃爍「HELLO WORLD」。 –
您可以在單獨的線程中跟蹤「Hello」和「World」。 或者當「世界」是光線追蹤時動畫「你好」。
曾經有一個樣本Java小程序(很可能仍然是),用於測試什麼是調度算法您的JVM和底層操作系統的使用。它動畫兩個(或者可選更多的?不記得)條逐漸填滿,每個條由不同的線程以相同的優先級動畫化。
,打印等價物:
red 1
red 2
green 1
red 3
green 2
等控制檯,在我看來,在精神上是最接近於「你好,世界」的梗概性質。也就是說,「我可以讓計算機做一些無用但可見的事情嗎?」
因此,在每個線程中,您需要一系列暫停(無論是忙碌循環還是休眠,直到您,以及您選擇的哪一個可能會影響輸出,這取決於您的併發調度方式),每個暫停都有一些輸出。你可能想要同步輸出 - 並不是真正必要的,但是如果一條線被調度程序分解,那麼閱讀起來會很尷尬。然後,如果你的併發模型是合作的(無論是新石器時代的線程還是基於協同例程的),你還必須添加合適的收益率,以防止在綠條開始之前填充紅條。這告訴你,你已經成功地做出了你的併發代碼交錯。
謝謝!雖然有點幹,但我認爲這是迄今爲止最好的答案。 – jberryman