我目前正在为微控制器编写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()
and的最后一个参数tryEmplaceUntil()
,但我宁愿避免在这种简单的情况下使用这种模板魔术-为了获得最后一个参数而进行所有这些递归实例化似乎有点过头了,特别是当我可视化如果用户做错事情时编译器将产生的错误...