在 C++ 中将数据从一个线程发送到另一个线程的最快方法是什么?

2024-03-02

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

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

http://tradexoft.wordpress.com/2012/10/22/how-to-move-data- Between-threads-in-100-nanoseconds/ http://tradexoft.wordpress.com/2012/10/22/how-to-move-data-between-threads-in-100-nanoseconds/

基本上,消费者等待计数器增加,然后调用处理函数。所以代码真的不多。但我还是很惊讶它花了 100 纳秒。

消费者看起来像这样:

 void operator()()
    {
      while (true)
      {
        while (w_cnt==r_cnt) {};
        auto rc=process_data(data);
        r_cnt++;
        if (!rc)
          break;
      }
    }

当生产者有可用数据时,只需增加 w_cnt 即可。

有更快的方法吗?


我想你的延迟是操作系统如何安排上下文切换的产物,而不是自旋锁本身,我怀疑你对此能做些什么。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C++ 中将数据从一个线程发送到另一个线程的最快方法是什么? 的相关文章

随机推荐

  • 参考Qt中的Sender对象

    我遇到了一些麻烦 我对 Qt 和 C 相当陌生 可以说是在试水 我将尝试如下描述我的问题 我有一条线编辑QLineEdit此编辑有一个如下所示的连接 connect my lineedit SIGNAL textEdited QString
  • php xpath获取属性等于的节点

    我有一个 xml 如何获取节点levelone有一个名为myatt其值为a然后访问它的myval 我尝试参考其他帖子来使其工作 但它似乎不起作用我的 xpath 有什么问题 this gt myXmlObj gt xpath levelon
  • 翻转视图 iPhone

    请考虑下面的代码 并告诉我我做错了什么 我想在两个 UIView 之间切换 不知何故 当我从初始视图翻转时 我只是得到翻转的视图 没有动画 当我向后翻转时 动画显示得很好 翻转是由视图本身上的按钮触发的 IBAction showMoreI
  • [UIAlertView 显示] 如何工作?

    我想做一些类似于 UIAlertView 的事情 即 不引用任何 UIView 或 UIViewController 使用presentModalViewController 在所有窗口顶部呈现一个 UIViewController 查看文
  • vim,将 script.py 粘贴到 python 解释器会丢失格式

    我正在尝试使用 ConqueTerm 重新映射一个键 以将脚本中选定的文本拉入 放入 Python 解释器中 一切都很好 除了这个 def main print Testing 123 main 变成这样 gt gt gt def main
  • 当数据为0时,如何使chartJs堆叠条形始终四舍五入?

    我想出了这个小提琴 https jsfiddle net 2s09hqLu https jsfiddle net 2s09hqLu 它按照我想要的方式堆叠了圆形图表 但问题是当数据数组中的值为 0 时 它不会使其四舍五入 我总是希望它四舍五
  • python中的连续字母列表并获取它的每个值

    我遇到了几乎同样的问题 如何制作连续的字母列表Python 从a z然后从aa ab ac等 https stackoverflow com questions 29351492 how to make a continuous alpha
  • 放大后删除绘制的矩形缩放框

    我正在尝试编写一个透明的可拖动矩形缩放框 一旦鼠标再次抬起 它就会放大该区域并删除绘制的矩形 我已经可以进行缩放并绘制矩形 但是我不能 1 弄清楚如何使其透明 和 2 弄清楚如何在放大后删除矩形 一旦单击鼠标在放大的图像上绘制另一个缩放框
  • 错误:请求失败,状态代码为 405

    我正在尝试在 Laravel React js 组合中建立 axios 示例 我通过以下命令配置了我的项目 作曲家创建项目 prefer dist laravel laravel react laravel basic 8 php arti
  • 使用for循环遍历java中的列表

    如何使用索引迭代列表数据结构 例如 考虑一个列表形式的句子 每个元素都是一个单词 我可以使用索引逐步浏览每个单词吗 像这样的事情 sentence defined something like this List
  • Django、ModelChoiceField() 和初始值

    我正在使用这样的东西 field1 forms ModelChoiceField queryset 如何使我的表单显示所选的值 如果你想设置默认的初始值 你应该定义initial http docs djangoproject com en
  • 如何将字体精美的图标放入选择下拉菜单中?

    我一直在努力在 vuejs 的选择下拉菜单中设置一个很棒的字体图标 我尝试过一些方法 比如
  • 在javascript中使用map或reduce将二维数组转换为对象

    是否可以转换 35 Bill 20 Nancy 27 Joan to Bill 35 Nancy 20 Joan 27 使用 map or reduce 方法 我可以使用以下方法转换数组 const arr 35 Bill 20 Nancy
  • Corona SDK 的本地通知 (Android)

    有没有办法在使用 Corona SDK 时实现本地通知 这是 Android 特定的 因为我们已经找到了 iOS 方向 Cheers 目前 Corona 上的本地通知仅适用于 iOS Android 版本尚未完成 完成后 我将按照 Andr
  • 将 Numpy 矩阵显示为视频

    我有一个 numpy 矩阵 其中每一行都是一张图片 我可以重塑行并使用 matplotlib pyplot 显示图像 问题是 我不想单独显示图像 我想像视频一样依次显示它们 这在Python中怎么可能呢 好吧 我不知道这是否是最好的方法 但
  • 包含(大多数)所有元素的 HTML 页面,用于样式设置

    是否有人拥有或知道包含所有元素 带有口语文本或其他内容 的 HTML 页面 我可以做一个 但我想一定有人已经这样做了 当开始一个项目时 我喜欢为链接 列表 表格等设置一些基本样式 包含所有元素的 HTML 页面将帮助我加快此过程 我很乐意创
  • 如何在 iOS 6 中启动具有特定地址的 iOS 地图应用程序?

    我有一个应用程序 允许用户启动地图应用程序 Google 或 Apple 来查看地址 我曾经这样做过 Address address self person addresses objectAtIndex 0 NSString addres
  • 访问页面时自动点击页面上的锚链接

    我之前问过这个问题 但一些专家告诉我补充一下 这可以重新加载给定的链接 但我想知道如何在 id 的帮助下单击元素 锚点 是否有任何代码在执行时会单击 id dp99 并且我希望在访问页面时执行此 javascript 这是 HTML a h
  • Cordova、iOS 和 iframe 不会加载内容,除非我允许访问 href="*"

    我有一个网络应用程序 它有一个嵌入式地图字段 它是使用 iframe 实现的https maps google com https maps google com 我正在将我们的应用程序 当前作为主屏幕图标运行 移植到 iOS 上的 Cor
  • 在 C++ 中将数据从一个线程发送到另一个线程的最快方法是什么?

    我尝试过构建一个简单的生产者 消费者程序的实验 它们在单独的线程中运行 生产者生成一些数据 消费者在另一个线程中获取它 我实现的消息传递延迟约为 100 纳秒 谁能告诉我这是否合理或者是否有更快的实现 我没有使用锁 只是简单的内存计数器 我