C++ 在C+中,从一个线程向另一个线程发送数据的最快方式是什么+;?

C++ 在C+中,从一个线程向另一个线程发送数据的最快方式是什么+;?,c++,multithreading,low-latency,C++,Multithreading,Low Latency,我尝试了一个实验,在那里我建立了一个简单的生产者/消费者程序。它们在不同的线程中运行。生产者生成一些数据,消费者在另一个线程中获取数据。我实现的消息传递延迟大约为100纳秒。有人能告诉我这是否合理,或者是否有更快的实现 我没有用锁。。。只是简单的内存计数器。我的实验描述如下: 基本上,使用者等待计数器递增,然后调用处理函数。所以实际上没有太多代码。但我还是很惊讶它花了100纳秒 消费者看起来是这样的: void operator()() { while (true)

我尝试了一个实验,在那里我建立了一个简单的生产者/消费者程序。它们在不同的线程中运行。生产者生成一些数据,消费者在另一个线程中获取数据。我实现的消息传递延迟大约为100纳秒。有人能告诉我这是否合理,或者是否有更快的实现

我没有用锁。。。只是简单的内存计数器。我的实验描述如下:

基本上,使用者等待计数器递增,然后调用处理函数。所以实际上没有太多代码。但我还是很惊讶它花了100纳秒

消费者看起来是这样的:

 void operator()()
    {
      while (true)
      {
        while (w_cnt==r_cnt) {};
        auto rc=process_data(data);
        r_cnt++;
        if (!rc)
          break;
      }
    }
当生产者有可用数据时,它只是增加w_cnt


有没有更快的方法?

我想您的延迟是操作系统如何安排上下文切换的结果,而不是自旋锁本身,我怀疑您对此能做多少


但是,您可以使用环形缓冲区一次移动更多数据。如果一个线程写入,一个线程读取,则可以实现无锁的环形缓冲区。本质上,这将是相同的自旋锁方法(直到
taildx!=headidx
),但生产者可以在将其切换到消费者之前将多个值泵入缓冲区。这应该会提高整体延迟(但不是单值延迟)。

如果线程在不同的内核上执行,那么从一个线程“发送消息”到另一个线程的最快方式是

当您写入某个内存位置时,实际上是写入到,而不是主内存位置。写入缓冲区由处理器定期刷新到主存。此外,当指令重新排序时,写入指令可能会延迟。当实际写入主存时,缓存一致性协议起作用,并“通知”另一个处理器内存位置更新。之后,另一个处理器使缓存线失效,另一个线程将能够看到您的更改


Store barrier强制处理器刷新写入缓冲区并禁止指令重新排序,这样您的程序将能够每秒发送更多消息。

您是如何准确测量这100 ns延迟的?不要忘记考虑测量偏差。此外,使用这种类型的用户空间“旋转锁”对您的整体性能极为不利。我发现100纳秒的测量值本身已经很模糊了…“我很惊讶它竟然用了100纳秒”——我也是。对于线程间通信来说,这看起来确实很短,即使可能在轮询上浪费了几乎一个完整的内核。您要求同步优于100ns的原因是什么?如果每个生产者-消费者方案都使用忙等待实现,计算机将融化。我喜欢环缓冲区的想法。C++中有没有引用实现?我知道Java破坏者,但不太清楚他们是如何做到的。据我所知,在我当前的生产者/消费者实现中没有任何上下文切换。两个线程都在忙着等待。如果您搜索“环形缓冲区”或“循环队列”,并包含诸如“C++”之类的关键字,您应该会找到大量代码。真的,这是一个如此简单的概念,你几乎不需要。创建一个固定大小的数组,定义一个head和tail索引,然后就开始了。
push
推进尾部,而
pop
推进头部。当然,你可以按数组大小进行模运算。您需要小心不要填充最后一个元素(例如
head==tail
),因为该状态已用于表示队列为空。明白了吗。。。有界队列本质上。。。但是,如果我有多个生产者,我需要使用旋转锁(TA或CAS),对吗?(我已经有了类似的东西,但q是无界的…)有没有办法只使用带有用户级锁的环形缓冲区?如果最多有两个线程,其中一个总是写,另一个总是读,那么这只在没有锁的情况下有效,这似乎是您试图解决的问题。为什么需要如此快速的同步?你在做什么?我不知道你需要多大的实时性,但当你处理在特定时间发生的事件时,你通常可以通过在消息上加盖实际事件时间的戳记来“落后于时钟”。在亚毫秒的时间内做出响应是很好的,但是在您的系统中还有什么其他的延迟呢?例如,您是否向web服务发送数据包以响应交易价格?如果你这样做了,那么0.7us的滞后肯定是无关紧要的。如果实际响应需要100毫秒,那么为不到0.001%的响应而争吵是相当愚蠢的。当然,这个数字纯粹是说明性的。