Tôi hiện đang viết một RTOS cho vi điều khiển. Toàn bộ điều được viết bằng C ++ 11 - nếu có ai quan tâm và liên kết đến kho lưu trữ ở phía dưới.
Hiện tại tôi đang viết một lớp là một hàng đợi dữ liệu đơn giản để truyền các đối tượng giữa các luồng (hoặc giữa các trình xử lý ngắt và các luồng hoặc các trình xử lý ngắt và các trình xử lý ngắt khác). Thông thường tôi cố gắng làm theo một số API phổ biến được tìm thấy trong các dự án khác, nhưng tôi không tìm thấy bất kỳ ví dụ nào về hàng đợi đồng thời có emplace()
chức năng VÀ hỗ trợ thời gian chờ.
"Vấn đề" chung của tôi là tôi không thể quyết định giữa hai giao diện này:
( std::chrono::duration<Rep, Period>
là một kiểu templated, tôi bỏ qua mẫu soạn sẵn cho rõ ràng)
Phiên bản đầu tiên:
template<typename T>
class FifoQueue
{
public:
...
template<typename... Args>
int tryEmplaceFor(std::chrono::duration<Rep, Period>, Args&&... args);
int tryPopFor(T&, std::chrono::duration<Rep, Period>);
int tryPushFor(const T&, std::chrono::duration<Rep, Period>);
int tryPushFor(T&&, std::chrono::duration<Rep, Period>);
...
}
Phiên bản thứ hai:
template<typename T>
class FifoQueue
{
public:
...
template<typename... Args>
int tryEmplaceFor(std::chrono::duration<Rep, Period>, Args&&... args);
int tryPopFor(std::chrono::duration<Rep, Period>, T&);
int tryPushFor(std::chrono::duration<Rep, Period>, const T&);
int tryPushFor(std::chrono::duration<Rep, Period>, T&&);
...
}
(sẽ có một bộ thứ hai của các hàm này có ...Until
hậu tố - chúng sẽ sử dụng dấu thời gian thay vì thời lượng)
Phiên bản đầu tiên tuân theo "phong cách chung" là có thời gian chờ là tham số cuối cùng (ví dụ là hàng đợi tin nhắn POSIX std::condition_variable
, hàng đợi đơn giản trong bất kỳ RTOS nào cho vi điều khiển). Vấn đề là không thể có đối số hết thời gian này là đối số cuối cùng cho hàm tryEmplaceFor (), bởi vì trong trường hợp các đối số "đã biết" của các mẫu biến đổi phải là đầu tiên (*). Vì vậy, phiên bản thứ hai là "nhất quán" - tất cả các chức năng có thời gian chờ đều có thời gian chờ là đối số đầu tiên. Biến thể này có một vấn đề rõ ràng là có thể là ví dụ đầu tiên về việc hết thời gian làm đối số đầu tiên cho chức năng đó.
Giao diện nào sẽ phục vụ HĐH tốt hơn:
- thiết lập tiêu chuẩn có thời gian chờ là đối số cuối cùng (ngoại trừ
tryEmplaceFor()
vàtryEmplaceUntil()
- trong đó phải là đối số đầu tiên (*))? - tính nhất quán - thích thời gian chờ là đối số đầu tiên?
(*) - Tôi biết rằng về mặt kỹ thuật tôi có thể có thời gian chờ như là đối số cuối cùng cho tryEmplaceFor()
và tryEmplaceUntil()
, nhưng tôi thà tránh sử dụng ví dụ mẫu ma thuật cho kịch bản đơn giản như vậy - làm tất cả những instantiations đệ quy chỉ để có được tranh luận cuối cùng dường như một chút quá mức cần thiết, đặc biệt là khi tôi hình dung trình biên dịch lỗi sẽ tạo ra trong trường hợp người dùng làm gì đó sai ...