Attualmente sto scrivendo un RTOS per microcontrollori. Il tutto è scritto in C ++ 11 - se qualcuno è interessato, e il link al repository è in fondo.
Attualmente sto scrivendo una classe che è una semplice coda dati per il passaggio di oggetti tra thread (o tra gestori di interrupt e thread o gestori di interrupt e altri gestori di interrupt). Di solito cerco di seguire alcune API comuni trovate su altri progetti, ma non ho trovato nessun esempio di coda concorrente che ha emplace()
funzione AND supporta timeout.
Il mio "problema" generale è che non riesco a decidere tra queste due interfacce:
( std::chrono::duration<Rep, Period>
è un tipo di modello, ometto il modello boilerplate per chiarezza)
Prima versione:
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>);
...
}
Seconda versione:
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&&);
...
}
(ci sarà una seconda serie di queste funzioni con suffisso ...Until
- queste utilizzerebbero il tempo anziché la durata)
La prima versione segue uno "stile comune" di avere il timeout come ultimo parametro (esempi sono code di messaggi POSIX, std::condition_variable
, code semplici in qualsiasi RTOS per microcontrollori). Il problema è che non è possibile avere questo argomento di timeout come l'ultimo per la funzione tryEmplaceFor (), perché nel caso di modelli variadici gli argomenti "noti" devono essere i primi (*). Quindi la seconda versione è "coerente": tutte le funzioni con timeout hanno il timeout come primo argomento. Questa variante ha un ovvio problema di essere probabilmente il primo esempio di avere il timeout come primo argomento per tale funzionalità.
Quale interfaccia servirebbe meglio il sistema operativo:
- standard stabilito di avere il timeout come ultimo argomento (con l'eccezione di
tryEmplaceFor()
etryEmplaceUntil()
- dove deve essere il primo argomento (*))? - coerenza - preferisci che il timeout sia il primo argomento?
(*) - So che tecnicamente potrei avere il timeout come ultimo argomento per tryEmplaceFor()
e tryEmplaceUntil()
, ma preferirei evitare l'uso di tale modello magico per uno scenario così semplice - facendo tutte queste istanze ricorsive solo per ottenere l'ultimo argomento sembra un po 'eccessivo, specialmente quando visualizzo gli errori che il compilatore produrrebbe nel caso in cui l'utente faccia qualcosa di sbagliato ...