Sự khác biệt chính, như bạn chỉ ra trong câu hỏi của mình, là liệu trình lập lịch biểu có bao giờ ưu tiên một chủ đề hay không. Cách một lập trình viên nghĩ về việc chia sẻ cấu trúc dữ liệu hoặc về việc đồng bộ hóa giữa các "luồng" rất khác nhau trong các hệ thống phòng ngừa và hợp tác.
Trong một hệ thống hợp tác xã (trong đó trôi qua rất nhiều tên, hợp tác đa nhiệm , nonpreemptive đa tác vụ , đề sử dụng cấp , chủ đề màu xanh lá cây , và sợi là năm cái phổ biến hiện nay) các lập trình viên được đảm bảo rằng mã của họ sẽ chạy nguyên tử càng lâu càng họ không thực hiện bất kỳ cuộc gọi hệ thống hoặc cuộc gọi nào yield()
. Điều này giúp dễ dàng xử lý các cấu trúc dữ liệu được chia sẻ giữa nhiều sợi. Trừ khi bạn cần thực hiện một cuộc gọi hệ thống như là một phần của phần quan trọng, các phần quan trọng không cần phải được đánh dấu ( ví dụ như với mutex lock
và unlock
các cuộc gọi). Vì vậy, trong mã như:
x = x + y
y = 2 * x
lập trình viên không cần lo lắng rằng một số sợi khác có thể làm việc với các biến x
và y
cùng một lúc. x
và y
sẽ được cập nhật cùng nhau nguyên tử từ góc độ của tất cả các sợi khác. Tương tự, tất cả các sợi có thể chia sẻ một số cấu trúc phức tạp hơn, như một cái cây và một cuộc gọi như thế tree.insert(key, value)
sẽ không cần phải được bảo vệ bởi bất kỳ phần đột biến hoặc phần quan trọng nào.
Ngược lại, trong một hệ thống đa luồng được ưu tiên, như với các luồng thực sự song song / đa lõi, mọi khả năng xen kẽ các hướng dẫn giữa các luồng đều có thể trừ khi có các phần quan trọng rõ ràng. Một ngắt và ưu tiên có thể trở thành giữa bất kỳ hai hướng dẫn. Trong ví dụ trên:
thread 0 thread 1
< thread 1 could read or modify x or y at this point
read x
< thread 1 could read or modify x or y at this point
read y
< thread 1 could read or modify x or y at this point
add x and y
< thread 1 could read or modify x or y at this point
write the result back into x
< thread 1 could read or modify x or y at this point
read x
< thread 1 could read or modify x or y at this point
multiply by 2
< thread 1 could read or modify x or y at this point
write the result back into y
< thread 1 could read or modify x or y at this point
Vì vậy, để chính xác trên một hệ thống phòng ngừa hoặc trên một hệ thống có các luồng thực sự song song, bạn cần bao quanh mọi phần quan trọng bằng một số loại đồng bộ hóa, như một mutex lock
ở đầu và một mutex unlock
ở cuối.
Do đó, các sợi tương tự như các thư viện i / o không đồng bộ hơn là các luồng được ưu tiên hoặc các luồng thực sự song song. Bộ lập lịch sợi được gọi và có thể chuyển đổi các sợi trong các hoạt động i / o có độ trễ dài. Điều này có thể mang lại lợi ích của nhiều hoạt động i / o đồng thời mà không yêu cầu các hoạt động đồng bộ hóa xung quanh các phần quan trọng. Do đó, việc sử dụng các sợi có thể có độ phức tạp lập trình ít hơn các luồng song song hoặc thực sự song song, nhưng việc thiếu đồng bộ hóa xung quanh các phần quan trọng sẽ dẫn đến kết quả thảm hại nếu bạn cố chạy các sợi thực sự đồng thời hoặc phủ đầu.