Digamos, estoy usando un simple algoritmo recursivo para fibonacci, que se ejecutaría como:
fib(5) -> fib(4)+fib(3)
| |
fib(3)+fib(2)|
fib(2)+fib(1)
y así
Ahora, la ejecución seguirá siendo secuencial. En lugar de eso, ¿cómo iba a codificar esta manera que fib(4)
y fib(3)
son calculados por el desove 2 hilos separados, a continuación, en fib(4)
, 2 hilos son generados por fib(3)
y fib(2)
. Lo mismo para cuando fib(3)
se divide en fib(2)
y fib(1)
?
(Soy consciente de que la programación dinámica sería un enfoque mucho mejor para Fibonacci, solo la usé como un ejemplo fácil aquí)
(si alguien pudiera compartir una muestra de código en C \ C ++ \ C # también, sería ideal)
fib(n)
no terminará hasta que obtenga los resultados de ambos fib(n-1)
y fib(n-2)
. Esto provocará un punto muerto, ya que para que un hilo termine y regrese a la encuesta, deberá tomar otro hilo del grupo. ¿Hay alguna forma de evitar esto?
fib
debería ser una función pura (que presumiblemente es el caso aquí). Una buena propiedad es que si la versión recursiva secuencial es correcta, la versión paralela también será correcta. Pero si es incorrecto y presenta una recursión infinita, de repente habrá creado una bomba tenedor .