2012-10-18 12 views
5

Chúng tôi sử dụng PPL Đồng thời :: TaskScheduler để gửi sự kiện từ đường dẫn phương tiện đến các khách hàng đã đăng ký (thường là ứng dụng GUI).Làm thế nào để thực hiện một back-off với Microsoft PPL trọng lượng nhẹ công việc lên lịch?

Những sự kiện này là C++ lambdas được chuyển đến Đồng thời :: TaskScheduler :: ScheduleTask().

Nhưng, khi tải, đường ống có thể tạo sự kiện ở tốc độ lớn hơn khách hàng có thể tiêu thụ chúng.

Có chiến lược PPL nào tôi có thể sử dụng để khiến người điều phối sự kiện không xếp hàng một sự kiện (trong thực tế, tác vụ được lên lịch) nếu 'hàng đợi' của các tác vụ được lập lịch lớn hơn N? Và nếu không, làm thế nào tôi sẽ cuộn của riêng tôi?

Trả lời

1

Nhìn vào API, có vẻ như không có cách nào để biết liệu trình lên lịch có tải nặng hay không, cũng không có cách nào để nói cách xử lý trong trường hợp như vậy. Sự hiểu biết của tôi là trong khi có thể thiết lập giới hạn về số lượng các luồng có thể chạy trong một trình lập lịch sử dụng các chính sách, giao thức mà trình lên lịch có thể chấp nhận hoặc từ chối các nhiệm vụ mới không rõ ràng với tôi.

Đặt cược của tôi là bạn sẽ phải tự mình thực hiện cơ chế đó, bằng cách đếm số lượng tác vụ trong bộ lập lịch và có hàng đợi có giới hạn kích thước trước bộ lập lịch giúp bạn giảm thiểu luồng công việc đến.

Tôi giả sử bạn có thể sử dụng hàng đợi :: đơn giản cho lambdas của mình và mỗi khi bạn có sự kiện mới, bạn kiểm tra số lượng tác vụ đang chạy và thêm bao nhiêu từ hàng đợi càng tốt chạy số nhiệm vụ. Nếu hàng đợi vẫn đầy sau đó, thì bạn từ chối nhiệm vụ mới.

Để xử lý các nhiệm vụ đang chạy, bạn có thể bọc các nhiệm vụ của mình với chức năng giảm bộ đếm tại thời điểm hoàn thành (sử dụng mutex để tránh cuộc đua) và tăng bộ đếm khi lên lịch công việc mới.