Giả sử, tôi đang sử dụng một thuật toán đệ quy đơn giản cho MySpace, sẽ được thực thi như sau:
fib(5) -> fib(4)+fib(3)
| |
fib(3)+fib(2)|
fib(2)+fib(1)
và như thế
Bây giờ, việc thực hiện sẽ vẫn tuần tự. Thay vào đó, tôi sẽ viết mã này như thế nào fib(4)
và fib(3)
được tính bằng cách sinh ra 2 luồng riêng biệt, sau đó fib(4)
, 2 luồng được sinh ra cho fib(3)
và fib(2)
. Tương tự khi nào fib(3)
được chia thành fib(2)
và fib(1)
?
(Tôi biết rằng lập trình động sẽ là cách tiếp cận tốt hơn đối với Fibonacci, chỉ sử dụng nó như một ví dụ dễ dàng ở đây)
(nếu ai đó có thể chia sẻ một mẫu mã trong C \ C ++ \ C #, đó sẽ là lý tưởng)
fib(n)
sẽ không hoàn thành cho đến khi nhận được kết quả từ cả hai fib(n-1)
và fib(n-2)
. Điều này sẽ gây ra bế tắc, vì để một chủ đề kết thúc và quay trở lại cuộc thăm dò, nó sẽ cần phải lấy một chủ đề khác từ nhóm. Có cách nào để giái quyết vấn đề này không?
fib
phải là một hàm thuần túy (có lẽ là trường hợp ở đây). Một đặc tính tốt là nếu phiên bản đệ quy tuần tự là chính xác, phiên bản song song cũng sẽ chính xác. Nhưng nếu nó không chính xác và có tính năng đệ quy vô hạn, bạn sẽ đột nhiên tạo ra một quả bom ngã ba .