Hành Trình
Windows hỗ trợ một cơ chế gọi là Fiber (xuyên trình), tương tự như coroutine nhưng do người dùng chủ động chuyển đổi luồng thực thi. Đặc điểm nổi bật của cơ chế này là mô-đun lập lịch chỉ phụ trách lưu giữ ngữ cảnh và ngăn xếp, không can thiệp vào việc phân bổ thời gian CPU. Trong lập trình đơn luồng, cơ chế này mang lại hiệu quả tối ưu khi xử lý các tác vụ cần tạm dừng và tiếp tục luồng thực thi.
Mặc dù có thể tự xây dựng cơ chế coroutine, nhưng tận dụng Fiber được tích hợp sẵn trong hệ điều hành sẽ mang lại nhiều lợi ích vượt trội. Windows gọi cơ chế này là Fiber, từ này có thể hiểu theo nghĩa đen là “sợi chỉ” nhưng trong ngữ cảnh lập trình lại ám chỉ luồng xử lý mềm dẻo, linh hoạt. Quy trình làm việc với Fiber gồm các bước chính sau:
-
Chuyển đổi luồng thành Fiber: Sử dụng API ConvertThreadToFiber để biến một luồng hệ thống thành Fiber chính. Tuy nhiên, phương pháp phổ biến hơn là dùng CreateFiber để tạo Fiber mới với ngữ cảnh riêng biệt.
-
Quản lý ngữ cảnh chuyển đổi: Hàm CreateFiber trả về địa chỉ ngữ cảnh của Fiber vừa tạo, làm tham chiếu cho các lần chuyển đổi sau này. Quy trình chuyển đổi luồng thực thi giữa các Fiber bắt buộc sử dụng SwitchToFiber - đây là cách duy nhất để nhường quyền điều khiển cho Fiber khác.
-
Truy xuất thông tin Fiber: Hai hàm tiện ích GetCurrentFiber và GetFiberData đóng vai trò quan trọng trong việc lấy ngữ cảnh hiện hành và dữ liệu tham số truyền vào lúc khởi tạo. Đặc biệt, những hàm này được cài đặt dưới dạng inline trong các file header (.h) để tối ưu hiệu năng truy xuất.
Ưu điểm nổi bật của Fiber là tính chủ động trong chuyển đổi luồng xử lý, giúp lập trình viên kiểm soát chặt chẽ thứ tự thực thi. Tuy nhiên cũng chính vì vậy mà việc xây dựng cơ chế lập lịch (scheduler) cho các Fiber lại đòi hỏi sự chủ động từ phía lập trình viên, thông qua việc tổ chức luồng dữ liệu và quyết định thứ tự gọi SwitchToFiber phù hợp với logic ứng dụng.