我听说在Linux中执行系统调用(RT_PREEMPT内核)从来都不是实时安全的.
这看起来过于严格 - 如果没有系统调用,你的进程怎么能做任何事情(除非它必须完全通过DMA完成)?
这是真的,还是一些系统调用(如clock_gettime)实时安全?
可能的重复:
将 C++ 模板函数定义存储在 .CPP 文件中
为什么模板只能在头文件中实现?
为什么模板类的实现和声明要在同一个头文件中?
我有三个文件。在 base.h 中,我有一个类,它有一个使用模板的成员:
class Base {
protected:
template <class T>
void doStuff(T a, int b);
};
Run Code Online (Sandbox Code Playgroud)
在 base.cpp 中,我实现了 Base::doStuff():
#include "base.h"
template <class T>
void Base::doStuff(T a, int b) {
a = b;
}
Run Code Online (Sandbox Code Playgroud)
然后我尝试在我的项目的另一个类中使用它:
#include "base.h"
void Derived::doOtherStuff() {
int c;
doStuff(3, c);
}
Run Code Online (Sandbox Code Playgroud)
但是我收到一个链接错误,指出它找不到“doStuff(int, int)”
从我所看到的,如果不将此函数的实现移动到头文件中,这在 C++03 中是不可能的。有没有干净的方法来做到这一点?(我可以使用 C++11x 功能)。
我正在将Rust视为硬实时编程中C/C++的替代品.我发现了两个可能的问题:
1)如何避免调用Rust的GC?我已经看到了一些建议,我可以通过简单地避免托管指针和非实时安全库(例如Rust的标准库)来实现这一点 - 这是否足以保证我的实时任务永远不会调用GC?
2)如何将实时任务映射到OS线程?我知道Rust的标准库实现了N:M并发模型,但实时任务必须直接与一个OS线程对应.有没有办法产生这种类型的线程?
可以从Java应用程序内部设置Java GC选项,例如MaxGCPauseMillis(用于G1垃圾收集器),还是必须在用于启动应用程序的命令行上设置它们?
即我可以在代码中执行以下任何部分:
java -XX:+UseG1GC -XX:MaxGCPauseMillis=10 -XX:GCPauseIntervalMillis=100 -jar app.jar
Run Code Online (Sandbox Code Playgroud)