Şu anda mikrodenetleyiciler için bir RTOS yazıyorum. Her şey C ++ 11'de yazılmıştır - eğer kimse ilgilenirse ve depoya bağlantı alttadır.
Şu anda konuları (veya kesme işleyicileri ve iş parçacıkları veya kesme işleyicileri ve diğer kesme işleyicileri arasında) nesneleri geçirmek için basit bir veri kuyruğu olan bir sınıf yazıyorum. Genellikle diğer projelerde bulunan bazı yaygın API'ları izlemeye çalışırım, ancak emplace()
işlev VE zaman aşımlarını destekleyen eşzamanlı sıraya ilişkin herhangi bir örnek bulamadım .
Benim genel "sorunum" şu iki arayüz arasında karar veremem:
( std::chrono::duration<Rep, Period>
şablonlanmış bir tiptir, netlik için şablon kazan plakasını atlarım)
İlk versiyon:
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>);
...
}
İkinci versiyon:
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&&);
...
}
(bu işlevlerin ...Until
sonekiyle birlikte ikinci bir grup olacaktır - bunlar süre yerine zaman noktası kullanır)
İlk sürüm, son parametre olarak zaman aşımına sahip olmanın bir "ortak stili" takip eder (örnekler POSIX mesaj kuyrukları, std::condition_variable
mikrodenetleyiciler için herhangi bir RTOS'ta basit kuyruklardır). Sorun, tryEmplaceFor () işlevinin sonuncusu olarak bu zaman aşımı bağımsız değişkenine sahip olmanın mümkün olmamasıdır, çünkü değişken şablonlarda "bilinen" bağımsız değişkenlerin önce (*) olması gerekir. Yani ikinci sürüm "tutarlı" - zaman aşımı olan tüm işlevler zaman aşımına sahip olur. Bu varyant, muhtemelen böyle bir işlevsellik için ilk argüman olarak zaman aşımına sahip olmanın ilk örneği olma konusunda bariz bir soruna sahiptir.
Hangi arayüz işletim sistemine daha iyi hizmet eder:
- zaman aşımına son argüman olarak sahip olma standardını oluşturdu (
tryEmplaceFor()
vetryEmplaceUntil()
ilk argüman (*) nerede olmalıdır) hariç ? - tutarlılık - zaman aşımının ilk argüman olmasını ister misiniz?
(*) - Teknik olarak zaman aşımına son argüman olarak sahip olabileceğimi biliyorum tryEmplaceFor()
ve tryEmplaceUntil()
ancak böyle basit bir senaryo için böyle bir şablon büyüsü kullanmaktan kaçınmayı tercih ediyorum - sadece son argümanı almak için tüm bu yinelemeli örneklemeleri yapmak biraz abartılı görünüyor, özellikle kullanıcı yanlış bir şey yaparsa derleyici üretecek hataları görselleştirmek ...