- 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/
我的 Linux Centos Apache 服务器的性能有问题。我有一个程序(用 c 语言编写)可以同时执行许多 http 请求。这个过程本身看起来非常有效,就好像我可以同时向外部服务器发出 500
我想知道如何将并行端口上的数据引脚设置为高电平和低电平。我相信我可以使用 PyParallel 来实现此目的,但我不确定如何设置特定的引脚。 谢谢! 最佳答案 您在这里谈论的是软件-硬件接口(inte
让我有一个像这样的日期时间索引的数据框: date_time open high low close vol 2018-05-13 18:00:00 70.
在 emacs Octave 模式下,当我输入 M-x run-octave 时,命令会卡住,所以我使用 C-g 进行转义。我可以用 C-x b 切换到 *Inferior Octave* 缓冲区,但
我正在 sklearn 中运行 gridsearchCV,尝试使用此代码找到最佳模型参数。 modelDNN= KerasRegressor(build_fn=build_DNN_model, epo
美好的一天。我想知道 android 存储是否低,它会影响应用程序性能吗?因为同一个应用程序在另一台设备上运行速度很快,而同样的应用程序在另一台设备上非常滞后,后者有 12GB 内存中的 2GB 可用
所以我在列卡上有一个带有索引的表 当我运行时 SELECT COUNT(DISTINCT(card)) FROM table 它返回 490 个不同的条目 但是当我运行的时候 SHOW INDEXES
我正在使用手动方法将二进制转换为十进制。此代码在最后一位为高的情况下工作正常,例如:1001。当最后一位为零 [低] 时会出现错误。例如:1010 应该给出 10 但给出 5,因为没有考虑最后一位。有
我一直在努力优化我的站点和数据库,并且我一直在使用 mysqltuner.pl 来帮助解决这个问题。除了表缓存命中率,无论我在 my.cnf 中将它提高多高,我几乎都得到了正确的结果,我仍然命中大约
深入研究 sprite kit (xcode 5)。我正在使用两个示例程序,1. 创建新项目时包含的默认宇宙飞船示例和 2. 我下载的 Adventure Game。 在 iOS 模拟器中运行这些示例
编辑: 感谢大家在这里提供答案,项目已完成。 https://github.com/0xyg3n/ProcessDaemon/ 如果有人想出可能会更好的多线程解决方案,我想。 我是 C# 的新手,我想
我有一个交换 Word 变量的字节(低/高)的过程(它与 System.Swap 函数执行相同的操作)。该过程在编译器优化关闭时有效,但在编译器优化打开时无效。有人可以帮我解决这个问题吗? proce
我以前听说过这些术语描述语言,例如 C 并不是一种低级语言,C++是中级语言,而Python是一种高级语言。我知道它必须与代码的编译方式以及代码的编写方式有关。但是我想知道的是,什么将语言定义为这三类
我有一个关于 NoSQL 类型数据库的问题,特别是 MongoDB,但它通常适用于大多数键值或基于文档的存储。 NoSQL 的一些卖点是速度和可扩展性,但在我看来,与关系数据库相比,开销很大。 你有很
如果没有此代码,fps 为 60-65。但是当我使用这段代码时,fps 下降到 50。 另一个问题是某些设备上的 FPS 太低。然而,游戏非常简单。我对所有形状使用 ShapeRenderer。游戏在
您好,我的名字是 Ryan,我目前正在开发自己的 2D java 游戏。目前游戏世界中有很多物体。游戏重新开始时,世界会加载 100 棵随机放置的树木,这些树木是使用数组列表和树类制作的。我的游戏使用
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我刚刚将我的 Heroku postgres 数据库从 Kappa 计划(800MB RAM,postgres 9.1)升级到 Ronin 计划(1.7GB RAM,postgres 9.2),但性能
现在我正在使用我的 NSDictionary 并运行所有值的循环以找到低值、高值和计算平均值。 由于我是IOS 的新手,所以我想问问是否有更好的方法来做到这一点。有没有? 谢谢。 最佳答案 这个问题的
我目前正在使用 genuino 101 进行一个项目,我需要通过 i2c 读取大量数据,以填充任意大小的缓冲区。从下图中我可以看到读取请求本身只需要大约 3毫秒,写请求大约 200 纳秒。 但是在同一
我是一名优秀的程序员,十分优秀!