Angenommen, ich verwende ein einfaches rekursives Algo für Fibonacci, das wie folgt ausgeführt wird:
fib(5) -> fib(4)+fib(3)
| |
fib(3)+fib(2)|
fib(2)+fib(1)
und so weiter
Die Ausführung erfolgt weiterhin sequentiell. Wie würde ich dies stattdessen so codieren, dass fib(4)
und fib(3)
durch Berechnen von 2 separaten Threads berechnet werden, dann werden in fib(4)
und 2 Threads für fib(3)
und erzeugt fib(2)
. Gleiches gilt für wann fib(3)
wird auf fib(2)
und aufgeteilt fib(1)
?
(Mir ist bewusst, dass die dynamische Programmierung für Fibonacci ein viel besserer Ansatz wäre. Ich habe sie hier nur als einfaches Beispiel verwendet.)
(Wenn jemand ein Codebeispiel auch in C \ C ++ \ C # freigeben könnte, wäre das ideal)
fib(n)
erst beendet wird, wenn er die Ergebnisse von beiden fib(n-1)
und erhält fib(n-2)
. Dies führt zu einem Deadlock, da ein anderer Thread aus dem Pool entfernt werden muss, damit er beendet und zur Abfrage zurückkehrt. Gibt es einen Weg, dies zu umgehen?
fib
sich um eine reine Funktion handelt (was hier vermutlich der Fall ist). Eine nette Eigenschaft ist dann, dass, wenn die sequentielle rekursive Version korrekt ist, auch die parallele Version korrekt ist. Aber wenn es falsch ist und eine unendliche Rekursion aufweist, haben Sie plötzlich eine Gabelbombe erstellt .