Actualmente estoy escribiendo un RTOS para microcontroladores. Todo está escrito en C ++ 11, si alguien está interesado, y el enlace al repositorio está en la parte inferior.
Actualmente estoy escribiendo una clase que es una cola de datos simple para pasar objetos entre subprocesos (o entre controladores de interrupción y subprocesos o controladores de interrupción y otros controladores de interrupción). Por lo general, trato de seguir algunas API comunes que se encuentran en otros proyectos, pero no encontré ningún ejemplo de cola concurrente que tenga una emplace()
función Y admita tiempos de espera.
Mi "problema" general es que no puedo decidir entre estas dos interfaces:
( std::chrono::duration<Rep, Period>
es un tipo con plantilla, omito la plantilla repetitiva para mayor claridad)
Primera versió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>);
...
}
Segunda versión:
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&&);
...
}
(habrá un segundo conjunto de estas funciones con ...Until
sufijo; estas usarían un punto de tiempo en lugar de una duración)
La primera versión sigue un "estilo común" de tener el tiempo de espera como último parámetro (los ejemplos son colas de mensajes POSIX std::condition_variable
, colas simples en cualquier RTOS para microcontroladores). El problema es que no es posible tener este argumento de tiempo de espera como el último para la función tryEmplaceFor (), porque en el caso de plantillas variadas, los argumentos "conocidos" deben ser primero (*). Entonces, la segunda versión es "coherente": todas las funciones con tiempo de espera tienen el tiempo de espera como primer argumento. Esta variante tiene un problema obvio de ser probablemente el primer ejemplo de tener tiempo de espera como primer argumento para dicha funcionalidad.
Qué interfaz serviría mejor al sistema operativo:
- estándar establecido de tener el tiempo de espera como último argumento (con excepción de
tryEmplaceFor()
ytryEmplaceUntil()
- donde debe ser el primer argumento (*))? - consistencia: ¿prefiere el tiempo de espera como primer argumento?
(*) - Sé que técnicamente podría tener el tiempo de espera como último argumento para tryEmplaceFor()
y tryEmplaceUntil()
, pero prefiero evitar usar esa plantilla de magia para un escenario tan simple: hacer todas estas instancias recursivas solo para obtener el último argumento parece un poco exagerado, especialmente cuando visualizo los errores que el compilador produciría en caso de que el usuario haga algo mal ...
Respuestas:
Según lo sugerido por una respuesta que fue eliminada (desafortunadamente) y comentarios, seguí la línea de "consistencia" (segunda variante presentada) - en todas las funciones "try ... For" y "try ... Hasta" el tiempo de espera (duración o punto de tiempo) es el primer argumento.
Este es el código en la etapa actual - enlace
fuente