- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试通过 C++ 多线程解决网络流量问题。
给定一个网络(所有节点都由弧连接,每个弧连接2个且只有2个结束节点,一个是输入节点,另一个是输出节点,每个节点可以有多个输入弧和输出弧),每个节点需要做一些计算然后交换计算结果数据到其连接的输入和输出节点。
多个节点可以组成一个任务,由一个线程运行。这样,整个网络的计算工作量可以划分为多个任务。所有这些任务被插入 boost 线程池,这样所有线程都可以同时运行任务时间。
但是,如果一个节点(在线程任务中)需要与另一个节点(在另一个线程任务),存在同步问题。数据接收方需要等待数据在数据发送方的数据缓冲区中可用。
我的程序需要对网络进行分区,以便分配每个线程的任务工作量尽可能均匀。如果所有线程共享一个大数据缓冲区结构,则程序并行性不高很好,因为关键部分太大了。有些线程必须等待即使数据结构的一部分(其中对他们有用)已可用于读取或写入。
例如,一个大的数据缓冲区结构有以下缓冲区单元格:单元格 1、单元格 2、单元格 3、单元格 4。
当线程 1 试图写入单元 1 时,它必须锁定整个数据缓冲区结构,以便线程 2 无法读取或写入单元格 2,依此类推。
所以,我想将一个大型数据缓冲区结构分解为多个不同的数据单元根据线程号,使每个单元格只保存一个线程需要的数据任务。
例如,如果我们有 2 个线程,我们创建 2 个数据单元来保存 4 个线程所需的数据单独线程。如果我们有 4 个线程,我们创建 4 个数据单元,分别保存 4 个线程所需的数据。等等。
我的问题是:
(1) 如何设计数据单元格?你可以看到它的大小是基于线程的数量。
(2) 如何减少同步开销?临界区很小但是如果节点间数据交换频率很高,那么获取和释放互斥量的开销可能会非常高。
(3) 当一个节点的计算完成,数据写入到它的cell中时如何通知数据接收方节点,使得通知消息仅由等待线程接收运行接收节点计算任务。所有其他不相关的节点和线程都不是受影响。
程序对时间很敏感,消息交换的延迟应该是非常严格地控制并尽可能减少。
非常感谢任何帮助。
谢谢
最佳答案
我认为处理此问题的常用方法是在线程之间设置消息传递基础结构。
每个线程都有一个消息队列。在您的示例中,假设节点 N1 分配给线程 1,节点 N2 分配给线程 2,并且 N1 和 N2 之间有一条边。然后,当线程1完成N1计算后,向线程2发送消息:
“向节点N2发送输入”
要向线程发送消息,您只需锁定该线程的消息队列并附加您的消息。您使用一个互斥锁和两个条件变量(queue_not_empty_condition 和 queue_not_full_condition)来实现有界队列。当一个线程想要等待新工作时,它只是在其消息队列中休眠。
为了减少同步开销,您可能需要一种方法将多条消息放入队列(“批量发送”),同时只锁定互斥锁一次。然后在一个线程中循环看起来像这样:
if (I can do work without communicating with other threads)
do that work
else
send all pending messages (in batches to each destination thread)
wait on my input queue and pop the messages off in a batch
不过,消息的“批处理”可能会以复杂的方式与有界队列交互。天下没有免费的午餐。
关于c++ - 面向低延迟大数据交换的多线程boost C++程序设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7543612/
我正在创建一个多区域 AlwaysOn Sql Availability 组。我在东部有 2 个虚拟机,在西部有 1 个虚拟机。我需要使用面向公众的负载平衡器对这些进行负载平衡。是否可以使用存在于不同
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我是 Smalltalk 技术的新手。我的编程经验是使用 C 和 C++。我想了解smalltalk的设计方法论。谁能推荐一些用smalltalk开发的简单的实时应用程序,可以帮助像我这样的初学者探索
现在我已经对 web2py 比较熟悉了,我想试试 Django。 主要区别是什么? 考虑到 web2py 知识,最有效的入门方法是什么? (一定有一些python应用框架的知识,不是吗?) 编辑 另外
我之前发过一个问题,Moving away from VSS ,其中我向使用 VSS 的 Delphi 开发人员询问了最佳的 VCS 控件。大多数开发人员似乎将 svn 与 TortoiseSVN 一
引用this question ,收集对 Delphi 初学者真正有帮助的网站链接可能会很好。 第一个答案指向Delphi Basics ,这是一个非常好的网站。 但一定还有更多。 所以:请为这个社区
我已经构建了一个 saas 产品,其中 Angular 4 与 golang Rest api 集成,并将构建上传到了 aws ec2 实例上。我的项目是一个基于 Multi-Tenancy 的应用程
我是 .NET 开发人员,在此之前使用过 VB6。我已经非常熟悉这些环境,并在垃圾收集语言的上下文中工作。但是,我现在希望通过 native C++ 增强我的技能,但发现自己有点不知所措。具有讽刺意味
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
由于我在数学方面没有任何出色的技能,所以我问您是否存在我应该在未来可能会改变的类(class)中使用的算法。 考虑以下场景: “角色”类具有以下字段: private boolean admin; p
我有许多面向“列”的 csv 文件,我需要对其进行预处理才能最终索引它们。 这是面向时间的数据,每个“设备”都有大量的列(最多 128 列),例如: LDEV_XXXXXX.csv
我想就重构技巧的最佳资源展开讨论,着眼于前端 JavaScript 重构。 一个我尊重其意见的 friend 建议这个 book ,尽管它使用 Java 中的示例。我明白 OO 重构的原则应该翻译成另
我不明白如何使用 Jquery/javascript 处理对象。 以及如何创建私有(private)方法/变量?我在论坛上看到关闭,但我尝试过但没有用。以及如何查看方法/变量是否是私有(private
我已经使用 MATLAB 多年并且非常熟练。我习惯了 MATLAB 调试,您可以在其中跳过行并查看变量及其变化方式,这就是我学习编码的方式。我现在正在研究使用 FORTRAN、C++ 和 Python
我正在学习如何实现“单一 Activity - 多个 fragment ”架构。据我所知,这是如今很普遍的方法,你可以找到很多关于这个主题的文章。例如这个 http://vinsol.com/blog
目前是否有任何简单的方法可以在 Apache Tomcat Servlet 容器前面设置 YAWS Web 服务器,类似于流行的 Apache httpd + Tomcat 设置? 最佳答案 我不相信
我是一个相当有能力的 Ruby 脚本编写者/程序员,但一直感到要扩展到 C++ 的压力。我没能找到任何与“C++ for Ruby Programmers”相关的网站。 This site Pytho
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 5 年前。
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我在表上有一个名为 cart_product_fti 的全文索引 每当我使用它时,我都必须准确列出索引中的所有字段: MATCH (foo,bar,etc) 我的想法是,如果稍后我决定向索引添加/删除
我是一名优秀的程序员,十分优秀!