2013-06-14 27 views
5

Tôi đã nghe một đồng nghiệp nói rằng Nhiệm vụ về cơ bản là một chủ đề nhẹ. Đến từ một nền C++ (nơi mà các chủ đề mà đơn vị xử lý trọng lượng nhẹ nhất), điều này có vẻ phản trực giác với tôi.Nhiệm vụ có trọng lượng nhẹ so với Chủ đề không?

Nhiệm vụ không chỉ nặng như Chủ đề?

+0

Trùng lặp - http://stackoverflow.com/questions/4130194/what-is-the-difference-between-task-and-thread – EkoostikMartin

Trả lời

5

Bạn cần phân biệt giữa một đơn vị công việc (Nhiệm vụ) từ quá trình cơ bản được sử dụng để lưu trữ/thực thi chúng. Nó thậm chí không cần thiết cho các nhiệm vụ để chạy trên các chủ đề khác. Ví dụ, các nhiệm vụ có thể được thực hiện trong một ứng dụng đơn luồng mà định kỳ mang lại sự kiểm soát cho nhóm tác vụ.

Ngay cả khi Tác vụ được thực thi trên các chuỗi riêng biệt, thường không có mối quan hệ 1-1 giữa Task và Thread. Các chủ đề được preallocated như là một phần của một hồ bơi, và sau đó nhiệm vụ được lên kế hoạch để chạy trên các chủ đề có sẵn. Tạo một nhiệm vụ mới không yêu cầu phí tạo luồng, nó chỉ đòi hỏi chi phí của một enque trong một hàng đợi nhiệm vụ.

Điều này làm cho các tác vụ vốn có khả năng mở rộng hơn. Tôi có thể có hàng triệu tác vụ trong suốt thời gian tồn tại của ứng dụng, nhưng chỉ thực sự sử dụng một số chuỗi liên tục.

+1

"Điều này làm cho các tác vụ vốn có khả năng mở rộng hơn." Cần lưu ý rằng điều này không phải là duy nhất đối với 'Task'. Lớp 'ThreadPool' cũ hơn cung cấp khả năng mở rộng tương tự, cũng như các Cổng điều khiển IO, hoặc chỉ thực hiện một hàng đợi của nhà sản xuất/người tiêu dùng với một số lượng người tiêu dùng cố định' Chủ đề '. – mbeckish

+2

@mbeckish Bạn đúng, tôi tin rằng việc triển khai chuẩn là chính xác, một lớp dễ sử dụng trên ThreadPool. –

1

Bạn nói đúng - mọi thứ đều chạy trên một sợi dưới nắp.

Lý do người ta nói rằng một Task là nhẹ hơn một Thread là Microsoft đặt rất nhiều suy nghĩ vào việc Task s làm cho hiệu quả sử dụng Thread s, và thực hiện có lẽ là trọng lượng nhẹ hơn nhiều so với những gì các nhà phát triển trung bình sẽ tự mình tự mình sử dụng lớp học Thread.

EDIT

Một lời giải thích rõ ràng hơn là một đối tượng Task là trọng lượng nhẹ hơn một đối tượng Thread, và trong khi mỗi Task là cuối cùng chạy trên một Thread, tạo N Task đối tượng đồng thời dẫn đến ít hơn N đồng thời Thread đối tượng đang được sử dụng, cho số lớn N.

2

Thông thường, "chuỗi" ngụ ý bắt buộc đồng thời. Bắt đầu một luồng yêu cầu phân bổ một chồng và cấu trúc dữ liệu hệ điều hành nội bộ cho nó. Ngược lại, một "tác vụ" thường đề cập đến một tác phẩm đồng thời là tùy chọn, do đó một khung công tác song song (như OpenMP, Cilk Plus, TBB, PPL) có thể sử dụng cùng một luồng để thực hiện nhiều tác vụ. các nhiệm vụ và chuyển đổi song song tùy chọn thành song song thực chỉ khi cần thiết để giữ cho máy bận.

+0

Tôi đang bị treo lên trên ý tưởng về "đồng thời bắt buộc". Nếu bạn có nhiều chủ đề hơn là bạn có lõi, bạn sẽ được serializing chúng * ở mức độ nào đó *. Làm thế nào để ý tưởng đồng thời bắt buộc áp dụng cho số lượng lớn các chủ đề. (Tôi có thể hiểu những gì bạn đang nói từ bối cảnh của các câu trả lời khác. Thuật ngữ này chỉ gây nhầm lẫn.) – Richard

+0

@Richard - Chi phí của đối tượng .NET 'Thread' độc lập với số lõi, hoặc thậm chí là số các chuỗi hạt nhân mà các luồng được quản lý được ánh xạ.Chi phí là 1) khoảng 1 MB bộ nhớ được phân bổ cho mỗi đối tượng 'Thread', và 2) chi phí CPU của chuyển đổi ngữ cảnh khi bạn có nhiều chủ đề hơn lõi. Tiết kiệm được cung cấp bởi 'Task' hoặc' ThreadPool' là ứng dụng của bạn có thể tạo ra 1000 đối tượng 'Task' trong khi .NET có thể xử lý chúng chỉ với 20 đối tượng' Thread'. – mbeckish

+0

Chính xác hơn, 'chi phí CPU của chuyển đổi ngữ cảnh khi bạn có nhiều chủ đề sẵn sàng hơn lõi'. –

Các vấn đề liên quan