Một chủ đề là gì?


62

Làm thế nào một người sẽ thực hiện một threadpool? Tôi đã đọc trên wikipedia cho "threadpool" nhưng tôi vẫn không thể hiểu được người ta nên làm gì để giải quyết câu hỏi này (có thể vì tôi không hiểu lắm về chủ đề đơn giản là gì).

Ai đó có thể giải thích cho tôi bằng tiếng Anh đơn giản một threadpool là gì và làm thế nào một người sẽ trả lời câu hỏi này?

Câu trả lời:


96

Nhóm luồng là một nhóm các luồng không hoạt động được khởi tạo trước, sẵn sàng để được giao việc. Chúng được ưu tiên hơn việc khởi tạo các luồng mới cho mỗi tác vụ khi có một số lượng lớn các tác vụ ngắn được thực hiện thay vì một số lượng nhỏ các tác vụ dài. Điều này ngăn chặn việc phải chịu chi phí tạo ra một luồng nhiều lần.

Việc thực hiện sẽ thay đổi theo môi trường, nhưng theo thuật ngữ đơn giản, bạn cần có những điều sau đây:

  • Một cách để tạo chủ đề và giữ chúng ở trạng thái không hoạt động. Điều này có thể được thực hiện bằng cách để mỗi luồng chờ ở một rào chắn cho đến khi pool xử lý nó hoạt động. (Điều này cũng có thể được thực hiện với mutexes.)
  • Một thùng chứa để lưu trữ các luồng đã tạo, chẳng hạn như hàng đợi hoặc bất kỳ cấu trúc nào khác có cách để thêm một luồng vào nhóm và kéo một luồng ra.
  • Một giao diện tiêu chuẩn hoặc lớp trừu tượng cho các chủ đề để sử dụng trong công việc. Đây có thể là một lớp trừu tượng được gọi Taskvới một execute()phương thức thực hiện công việc và sau đó trả về.

Khi nhóm luồng được tạo, nó sẽ khởi tạo một số luồng nhất định để tạo sẵn hoặc tạo luồng mới khi cần tùy thuộc vào nhu cầu thực hiện.

Khi hồ bơi được trao một Task, nó sẽ lấy một sợi từ container (hoặc đợi một cái có sẵn nếu container rỗng), đưa nó a Taskvà gặp rào cản. Điều này làm cho luồng không hoạt động tiếp tục thực hiện, gọi execute()phương thức của Tasknó đã được đưa ra. Sau khi thực hiện xong, sợi chỉ quay trở lại hồ bơi để đưa vào thùng chứa để sử dụng lại và sau đó gặp rào cản của nó, tự ngủ cho đến khi chu kỳ lặp lại.


19
Nhóm luồng là một nhóm các luồng không hoạt động được khởi tạo trước, sẵn sàng để được giao việc. [...] Điều này ngăn không phải chịu chi phí tạo ra một luồng nhiều lần. - điều này nên được Google nhổ bất cứ khi nào ai đó tìm kiếm "nhóm luồng"
Rafael Eyng

Có tạo luồng chủ đề liên quan đến rào cản trong nội bộ? Bạn có thể chia sẻ tài liệu tham khảo, trên những dòng này?
trao đổi quá mức

@overexchange Không, không. Tài liệu tham khảo của tôi cho câu hỏi này là một ví dụ về cách tốt hơn để viết lại câu hỏi về rào cản của bạn . (Nếu bạn làm thế, tôi sẽ viết một câu trả lời.)
Blrfl

một trong những câu trả lời ngắn tốt nhất
Blood-HaZaRd

10

Nhóm luồng là một tập hợp các luồng được quản lý thường được tổ chức trong một hàng đợi, thực thi các tác vụ trong hàng đợi tác vụ.

Tạo một đối tượng luồng mới mỗi khi bạn cần một cái gì đó được thực thi không đồng bộ là tốn kém. Trong nhóm luồng, bạn chỉ cần thêm các tác vụ bạn muốn được thực thi không đồng bộ vào hàng đợi tác vụ và nhóm luồng sẽ đảm nhiệm việc gán một luồng có sẵn, nếu có, cho tác vụ tương ứng. Ngay sau khi nhiệm vụ hoàn thành, luồng hiện có sẵn yêu cầu một tác vụ khác (giả sử có bất kỳ trái nào).

Nhóm luồng giúp bạn tránh tạo hoặc phá hủy nhiều luồng hơn là thực sự cần thiết.

Tôi sẽ bắt đầu bằng cách tạo một lớp với một chuỗi các luồng và một chuỗi các nhiệm vụ. Sau đó thực hiện một phương thức thêm một tác vụ vào hàng đợi tác vụ và chuyển từ đó. Rõ ràng, bạn cũng nên cho phép đặt các luồng tối đa được phép trong nhóm luồng.


1

Trong ứng dụng đa luồng, nhóm luồng là một "nhóm các luồng có sẵn" có thể được ứng dụng của bạn sử dụng. Thông thường, ví dụ .NET, tất cả đều được quản lý để bạn chỉ định các tác vụ và một khi một luồng là miễn phí, nó sẽ thực hiện nó. Vì vậy, để thực hiện một luồng, tôi mong muốn tạo ra một khái niệm trong đó các tác vụ được tự động thực hiện bởi các luồng miễn phí mà không cần tạo luồng rõ ràng cho mỗi tác vụ.


1

Ví dụ thực tế cuộc sống;

  1. Cơ sở: Hệ điều hành
  2. Phần: Ứng dụng
  3. Mọi người: Chủ đề

Bạn có một cơ sở có 12 người đang làm việc. Có 3 phần của cơ sở này. Nhà bếp, phòng vệ sinh và an ninh. Nếu bạn không sử dụng kỹ thuật nhóm luồng, đó là cách nó hoạt động: Tất cả 12 người sẽ đứng trong phòng họp, nếu khách hàng mới đến cơ sở và yêu cầu nhiệm vụ, thì bạn sẽ tách mọi người theo nhóm và cử họ làm việc của họ và trở lại phòng họp Nhưng, trước khi họ đi làm nhiệm vụ, có một giai đoạn chuẩn bị. Họ cần mặc đồng phục chính xác, trang bị một số thiết bị nhất định và đi bộ đến phần đó, hoàn thành công việc và quay trở lại. Vì vậy, một khi mỗi khi họ hoàn thành công việc của mình (kết thúc chuỗi), họ cần quay trở lại phòng họp, cởi quần áo, lấy thiết bị ra và chờ công việc tiếp theo. Chúng đề cập đến việc tạo bối cảnh luồng, đó là phân bổ bộ nhớ và theo dõi thông tin của HĐH.

Nếu bạn đang sử dụng chuỗi tổng hợp, thì vào sáng sớm, bạn sẽ chỉ định 6 người vào bếp, 2 người vào phòng vệ sinh và 4 người để bảo vệ. Vì vậy, họ sẽ chỉ chuẩn bị một lần trong ngày. Ngay cả khi không có khách hàng ở bếp, 4 người đó sẽ ở đó, nhàn rỗi, cho bất kỳ nhiệm vụ sắp tới. Họ không cần quay lại phòng họp cho đến khi nhà bếp đóng cửa (ứng dụng kết thúc). 4 người này đang ở trong nhóm ứng dụng Bếp và sẵn sàng phục vụ nhanh chóng. Nhưng, bạn không thể hứa rằng họ làm việc cả ngày, vì nhà bếp có thể trở nên nhàn rỗi theo thời gian. Logic tương tự áp dụng cho phòng vệ sinh và an ninh là tốt.

Trong kịch bản đầu tiên, bạn không lãng phí bất kỳ luồng nào cho bất kỳ tác vụ nào, NHƯNG sẽ mất nhiều thời gian để chuẩn bị từng luồng cho mỗi tác vụ. Trong phần hai, bạn chuẩn bị trước các luồng, vì vậy bạn không thể đảm bảo bạn sẽ sử dụng tất cả các luồng cho tất cả các tác vụ, nhưng, hệ điều hành chủ yếu là tối ưu hóa tuyệt vời cho nó, vì vậy bạn có thể dựa vào nó một cách an toàn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.