Tôi muốn thực hiện một cách để lên lịch cho một tác vụ được thực thi sau này. Giao diện sẽ tương tự như setTimeout(function, milliseconds)
của JavaScript.C++ bị trì hoãn nhiệm vụ
Trong ứng dụng của tôi, một số tài nguyên được sở hữu bởi một chuỗi. Để tránh điều kiện chủng tộc, chúng phải luôn được truy cập từ cùng một chuỗi đó. Nếu các luồng khác muốn truy cập tài nguyên, chúng phải gửi một đối tượng nhiệm vụ tới luồng tài nguyên.
Vì vậy, hai vấn đề tôi cần phải giải quyết là:
- cử một nhiệm vụ to a thread
- chậm trễ invocation
Vấn đề đầu tiên là nhanh chóng cố định bằng cách sử dụng một hàng đợi lock-free trong đó có luồng tài nguyên ở phía tiêu thụ. (Tôi sử dụng concurrent_bounded_queue của TBB.) Tuy nhiên, vấn đề thứ hai không quá rõ ràng đối với tôi. Tôi có thể nghĩ đến hai chiến lược:
- Bắt đầu một chuỗi mới cho mỗi tác vụ. Chủ đề này sẽ ngủ chậm trễ yêu cầu, sau đó gửi nhiệm vụ đến hàng đợi đồng thời.
- Chỉ bắt đầu một chuỗi chạy vòng lặp lặp lại các tác vụ đã lên lịch và gọi chúng nếu thời gian chờ của chúng hết hạn.
Tôi đã thử nghiệm với cả hai cách tiếp cận và tôi có xu hướng ưu tiên đầu tiên bởi vì nó đơn giản và đáng tin cậy, trong khi thứ hai có xu hướng dễ bị lỗi tinh vi hơn. Cách tiếp cận đầu tiên ủy quyền cho bộ lập lịch trình chủ đề OS.
Tuy nhiên, giải pháp đầu tiên tạo ra nhiều chuỗi thời gian tồn tại ngắn, trong khi tôi thường nghe đề xuất sử dụng lại các chuỗi.
không có sự đảm bảo nào trong phương pháp truy tố kịp thời thứ hai. đôi khi bạn sẽ phải chờ một nhiệm vụ hoàn thành trước khi thực hiện nhiệm vụ thứ hai. Cách tiếp cận đầu tiên là tốt hơn. –
Số lượng các chủ đề sinh ra thực sự sẽ là nhiều? Giống như một vài ngàn houndred? Hãy nhớ rằng các chủ đề ngủ tiêu thụ khá gần với thời gian 0 CPU. –
@BartekBanachewicz Trong ứng dụng của tôi sẽ không có nhiều tác vụ được lập lịch đồng thời. Thông thường, họ sẽ thực hiện một hành động mỗi N mili giây. Họ làm điều này bằng cách lên lịch lại trước khi họ chết. – StackedCrooked