たとえば、次のように実行されるfibonacciの単純な再帰的アルゴリズムを使用しているとします。
fib(5) -> fib(4)+fib(3)
| |
fib(3)+fib(2)|
fib(2)+fib(1)
等々
これで、実行は引き続きシーケンシャルになります。その代わりに、どのように私がいることを、このように、コードだろうfib(4)
とはfib(3)
、2つの別々のスレッドを生成することによって計算されるが、その後にfib(4)
、2つのスレッドがために生み出されているfib(3)
とfib(2)
。がいつfib(3)
に分割されるのかfib(2)
と同じfib(1)
ですか?
(動的プログラミングはフィボナッチにとってはるかに優れたアプローチであることを知っています。ここで簡単な例として使用しただけです)
(誰かがC \ C ++ \ C#でもコードサンプルを共有できる場合、それは理想的です)
fib(n)
、それは両方から結果を取得するまで終了しませんfib(n-1)
とfib(n-2)
。スレッドが終了してポーリングに戻るには、プールから別のスレッドを取得する必要があるため、これによりデッドロックが発生します。これを回避する方法はありますか?
fib
が純粋な関数であることです(おそらくここではそうです)。優れた特性は、順次再帰バージョンが正しい場合、並列バージョンも正しくなることです。しかし、それが正しくなく、再帰が無限に続く場合は、突然フォーク爆弾が作成されます。