Saat ini saya sedang menulis RTOS untuk mikrokontroler. Semuanya ditulis dalam C ++ 11 - jika ada yang tertarik, dan tautan ke repositori ada di bagian bawah.
Saat ini saya sedang menulis sebuah kelas yang merupakan antrian data sederhana untuk melewatkan objek di antara utas (atau antara penangan interupsi dan utas atau penangan interupsi dan penangan interupsi lainnya). Biasanya saya mencoba mengikuti beberapa API umum yang ditemukan di proyek lain, namun saya tidak menemukan contoh antrian konkuren yang emplace()
berfungsi DAN mendukung waktu tunggu.
"Masalah" umum saya adalah bahwa saya tidak dapat memutuskan antara dua antarmuka ini:
( std::chrono::duration<Rep, Period>
adalah tipe templated, saya menghilangkan boilerplate template untuk kejelasan)
Versi pertama:
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>);
...
}
Versi kedua:
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&&);
...
}
(akan ada set kedua fungsi ini dengan ...Until
akhiran - ini akan menggunakan titik waktu bukan durasi)
Versi pertama mengikuti "gaya umum" memiliki batas waktu sebagai parameter terakhir (contohnya adalah antrian pesan POSIX std::condition_variable
,, antrian sederhana di RTOS apa pun untuk mikrokontroler). Masalahnya adalah bahwa tidak mungkin untuk memiliki argumen batas waktu ini sebagai yang terakhir untuk fungsi tryEmplaceFor (), karena dalam kasus templat variadik argumen "dikenal" haruslah yang pertama (*). Jadi versi kedua adalah "konsisten" - semua fungsi dengan batas waktu memiliki batas waktu sebagai argumen pertama. Varian ini memiliki masalah yang jelas mungkin menjadi contoh pertama dari memiliki batas waktu sebagai argumen pertama untuk fungsi tersebut.
Antarmuka mana yang akan melayani OS dengan lebih baik:
- menetapkan standar memiliki batas waktu sebagai argumen terakhir (dengan pengecualian
tryEmplaceFor()
dantryEmplaceUntil()
- di mana harus menjadi argumen pertama (*))? - konsistensi - lebih suka batas waktu menjadi argumen pertama?
(*) - Saya tahu bahwa secara teknis saya dapat memiliki batas waktu sebagai argumen terakhir untuk tryEmplaceFor()
dan tryEmplaceUntil()
, tetapi saya lebih suka menghindari penggunaan templat ajaib untuk skenario sederhana seperti itu - melakukan semua Instansiasi rekursif ini hanya untuk mendapatkan argumen terakhir sepertinya sedikit berlebihan, terutama ketika saya memvisualisasikan kesalahan kompiler akan menghasilkan jika pengguna melakukan sesuatu yang salah ...