Я зараз пишу RTOS для мікроконтролерів. Вся справа написана на C ++ 11 - якщо хтось зацікавлений, а посилання на сховище знаходиться внизу.
В даний час я пишу клас, який є простою чергою даних для передачі об'єктів між потоками (або між обробниками переривань і потоками або обробниками переривань та іншими обробниками переривань). Зазвичай я намагаюся слідувати деяким загальним API, знайденим в інших проектах, але я не знайшов жодного прикладу паралельної черги, яка має emplace()
функцію ТА підтримує таймаути.
Моя загальна "проблема" полягає в тому, що я не можу визначитися між цими двома інтерфейсами:
( std::chrono::duration<Rep, Period>
це шаблонний тип, я опускаю шаблону шаблону для ясності)
Перша версія:
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>);
...
}
Друга версія:
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&&);
...
}
(буде другий набір цих функцій із ...Until
суфіксом - вони використовуватимуть часову точку замість тривалості)
Перша версія дотримується "загального стилю" розміщення тайм-ауту в якості останнього параметра (приклади - черги повідомлень POSIX std::condition_variable
, прості черги в будь-якому RTOS для мікроконтролерів). Проблема полягає в тому, що неможливо мати цей аргумент тайм-ауту як останній для функції tryEmplaceFor (), тому що у випадку різних варіантів шаблонів "відомі" аргументи повинні бути першими (*). Отже, друга версія є "послідовною" - всі функції з таймаутом мають тайм-аут як перший аргумент. Цей варіант має очевидну проблему, ймовірно, перший приклад використання тайм-ауту як першого аргументу такої функціональності.
Який інтерфейс краще би обслуговував ОС:
- встановлений стандарт наявності тайм-ауту в якості останнього аргументу (за винятком
tryEmplaceFor()
іtryEmplaceUntil()
- де це повинен бути перший аргумент (*))? - послідовність - вважаєте за краще тайм-аут бути першим аргументом?
(*) - Я знаю , що технічно я міг мати тайм - аут в якості останнього аргументу для tryEmplaceFor()
і tryEmplaceUntil()
, але я не хотів би використовувати такий шаблон магію для такого простого сценарію - робити всю цю рекурсивну інстанціацій тільки , щоб отримати останній аргумент здається трохи зайвої, особливо коли я візуалізую компілятор помилок, якщо користувач робить щось не так ...