我在$ work处有一个应用程序,我必须在两个以不同频率调度的实时线程之间移动.(实际的调度是我无法控制的.)应用程序是硬实时的(其中一个线程必须驱动硬件接口),因此线程之间的数据传输应该是无锁的,并且无需等待尽可能.
重要的是要注意,只需要传输一个数据块:因为两个线程以不同的速率运行,所以有时会在较慢的线程的两个唤醒之间完成两个较快的线程迭代; 在这种情况下,可以覆盖写缓冲区中的数据,以便较慢的线程只获取最新的数据.
换句话说,双缓冲解决方案代替队列就足够了.这两个缓冲区在初始化期间分配,读取器和写入线程可以调用类的方法来获取指向这些缓冲区之一的指针.
C++代码:
#include <mutex>
template <typename T>
class ProducerConsumerDoubleBuffer {
public:
ProducerConsumerDoubleBuffer() {
m_write_busy = false;
m_read_idx = m_write_idx = 0;
}
~ProducerConsumerDoubleBuffer() { }
// The writer thread using this class must call
// start_writing() at the start of its iteration
// before doing anything else to get the pointer
// to the current write buffer.
T * start_writing(void) {
std::lock_guard<std::mutex> lock(m_mutex);
m_write_busy = true;
m_write_idx = 1 - m_read_idx;
return &m_buf[m_write_idx];
}
// The …Run Code Online (Sandbox Code Playgroud) c++ concurrency real-time producer-consumer double-buffering
我正在考虑在实时应用程序中使用虚拟继承.使用虚拟继承是否会产生类似于调用虚函数的性能影响?有问题的对象只会在启动时创建,但我担心层次结构中的所有函数是否都将通过vtable调度,或者只是来自虚拟基类的函数.
所以我有一个25个样本的阵列,我希望能够记录它是否从这25个采样时间间隔减少n或增加的趋势(基本上25个样本数组是我的缓冲区,每个说1毫秒填充).
请注意,这是我正在寻找的一般趋势,而不是单个衍生物(正如我将使用有限差分或其他数值微分技术获得).
基本上我希望我的数据有噪音,所以即使在进行过滤等操作之后也可能出现起伏.但这是我正在寻找的增加或减少行为的一般趋势.
我希望在每个ms中集成增加/减少行为以触发某个事件,这更多的是用户界面事件(闪烁LED),因此只要我能检测到一般趋势,它就不必非常延迟处理.
提前致谢!
如何找出真正的地理时间,就像在我的应用程序中我想要将实时附加到我的应用程序.
因此,如果用户在他的设备中更改时间,那么我应该只获得真实的时间 - 而不是设备时间
我的问题很混乱,但试着用简单的语言理解 -
我不想要设备时间,我想在任何时刻获得真正的预备时间
我有一个循环运行的代码,它根据当前时间保存状态.有时这可能只相差几毫秒,但由于某些原因,似乎DateTime.Now将始终返回至少10 ms的值,即使它仅在2或3 ms之后.这是一个主要问题,因为我保存的状态取决于它保存的时间(例如录制内容)
我的测试代码返回10 ms的每个值:
public static void Main()
{
var dt1 = DateTime.Now;
System.Threading.Thread.Sleep(2);
var dt2 = DateTime.Now;
// On my machine the values will be at least 10 ms apart
Console.WriteLine("First: {0}, Second: {1}", dt1.Millisecond, dt2.Millisecond);
}
Run Code Online (Sandbox Code Playgroud)
是否有另一种解决方案可以获得精确的当前时间到毫秒?
有人建议看秒表类.虽然秒表类是非常准确的,但它并没有告诉我当前的时间,我需要的东西是为了保存程序的状态.
我想要一个更好的C.让我解释一下:
我在C中做了很多编程,这对于具有实时需求的应用程序是必需的,例如音频编程,机器人,设备驱动程序等.
虽然我喜欢C,但是在花了很多时间在Haskell之后让我紧张的一件事就是缺少一个合适的类型系统.也就是说,只要你想编写一个更通用的函数,说一些操纵泛型指针的东西(比如说一个通用的链表)就必须把东西投射到void*什么东西上,然后你就会丢失所有类型的信息.它是一个全有或全无的系统,它不会让你编写泛型函数而不会失去类型检查的所有优点.
C++没有解决这个问题.我还是不想使用C++.我发现OO类和模板很令人头疼.
Haskell及其类型类确实解决了这个问题.您可以使用语义上有用的类型,并使用类型约束来编写对不依赖的类类操作的函数void.
但是我正在使用的域名,我不能使用Haskell,因为它不具备实时功能 - 主要是因为垃圾收集.GC是必需的,因为很难进行功能编程,这种编程很重,没有自动内存管理.但是,类型类的概念并没有特别针对C的语义.我想要C,但是使用Haskell的可靠类型系统,可以帮助我编写好的系统.但是,我真的想要C:我想控制内存管理,我想知道数据结构是如何布局的,我想使用(井型)指针算法,我想要可变性.
有这样的语言吗?如果是这样,为什么它不适合低级编程呢?
旁白:我知道在这个方向上有一些小的语言实验,但我对在真实世界的项目中真正可用的东西很感兴趣.我对成长到发达的语言感兴趣,但不是那么多"玩具"语言.
我应该补充一下,我听说过Cyclone,这很有意思,但是我无法让它为我编译(Ubuntu)而且我还没有听说过任何实际使用它的项目......欢迎任何其他建议.
谢谢!
我熟悉的唯一模型是漫射光,但这看起来比这更复杂.
为解决此问题,我创建了一个开源Java Thread Affinity库
当我有许多线程密切交互时,它可以减少延迟并增加吞吐量.对于单线程任务,它仍然可以减少相当多的抖动.
该程序查看调用System.nanoTime()和报告超过10x,000 ns 之间的时间差.
public class TimeJumpingMain {
static final long IGNORE_TIME = 1000 * 1000 * 1000; // the first second to allow warmup.
static final int minJump = 10; // smallest jump of 10 us.
static final int midJump = 100; // mid size jump of 100 us.
static final int bigJump = 1000; // big jump of 1 ms.
public static void main(String... args) {
int[] intervalTimings = new int[1000];
int[] …Run Code Online (Sandbox Code Playgroud) 在我的IIS 7.5上,我的SignalR应用程序总是使用长轮询.根据我的搜索,IIS 7.5尚不支持WebSockets.
我希望,我错过了一些工具或配置来启用IIS 7.5中的WebSockets.或者我没有?