Digamos, estou usando um algo recursivo simples para fibonacci, que seria executado como:
fib(5) -> fib(4)+fib(3)
| |
fib(3)+fib(2)|
fib(2)+fib(1)
e assim por diante
Agora, a execução ainda será seqüencial. Em vez disso, como codificaria isso para que fib(4)
e fib(3)
seja calculado gerando 2 threads separados e, em seguida fib(4)
, 2 threads sejam gerados para fib(3)
e fib(2)
. O mesmo para quando fib(3)
é dividido em fib(2)
e fib(1)
?
(Estou ciente de que a programação dinâmica seria uma abordagem muito melhor para Fibonacci, apenas a usei como um exemplo fácil aqui)
(se alguém pudesse compartilhar um exemplo de código em C \ C ++ \ C #, isso seria o ideal)
fib(n)
não será concluído até que obtenha os resultados de ambos fib(n-1)
e fib(n-2)
. Isso causará um impasse, pois, para que um encadeamento termine e retorne à enquete, será necessário retirar outro encadeamento do pool. Existe uma maneira de contornar isso?
fib
deve ser uma função pura (o que provavelmente é o caso aqui). Uma propriedade interessante é que, se a versão recursiva seqüencial estiver correta, a versão paralela também estará correta. Mas se estiver incorreto e apresentar recursão infinita, você terá subitamente criado uma bomba de forquilha .