c++ - 大对象线程间通信的最佳实践

标签 c++ multithreading caching boost lock-free

我需要非常关注当前多线程项目中的速度/延迟。

考虑以下线程间通信:

  • 线程 #1:处理一个大对象,称之为 A,它从网络事件中接收。此数据会显着改变其内部状态。
  • 线程 #2:需要了解对象 A 的当前、已更改的内部状态,以做出一些决策。

我基本上可以想到两种方法来进行:

  1. Thread #2 有一个指向对象 A 的指针,并且当发出信号时(例如,通过不断检查通过无锁队列发送的小对象或通过检查共享原子 bool),Thread #2 锁定对象 A 并读取它。

  2. 线程 #1 将某个版本的对象拷贝推送到无锁队列中,这样线程 #2 就可以简单地直接接收它、使用它,并在它完成时处理该拷贝。

方法 #1 避免了方法 #2 所需的昂贵的大型对象拷贝,但它总是需要锁定/解锁,并且如果我理解正确的话,还需要额外的 L3 缓存命中。

我知道可能没有任何简单的性能答案...我可能只需要进行基准测试。我最感兴趣的是最佳实践建议。具体来说,我想知道考虑缓存内存级别的问题,以了解信息是如何在内部传递和复制的。

最佳答案

这实际上取决于线程 2 试图从线程 1 访问多少信息。如果它需要完全访问线程 1 的所有对象/内存,那么是的,复制所有这些是昂贵的,我会做一个锁。但这也取决于时间。如果线程 2 需要的只是检查一个状态,比如一个变量,我会让线程 1 更新自身外部的一个较小的对象,该对象可以在没有锁的情况下共享,因为线程 2 仅读取而线程 1 仅写入。

此外,如果线程 2 仅读取并且可以在更新时对数据状态做出决定,那么您甚至可能不需要锁定。

关于c++ - 大对象线程间通信的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26534201/

相关文章:

c - C 中的结构指针未返回正确的值

c# - 已达到 Azure Redis 缓存最大连接数

javascript - Service Worker 从缓存中获取然后更新缓存

c++ - QCompleter::activated disconnected after losing and gaining focus

c# - MVVM WPF BackgroundWorker 和 UI 更新

c# - 无法理解为什么我会收到 NullReferenceException

asp.net-mvc - ASP.NET MVC : Caching combobox

c++ - 在 Rcpp(和 RcppArmadillo)中,如何检查 vec 是否包含复数?

c++ - std::unique 并从对象容器中删除重复项

c++ - 我可以将 *array 传递给 EXE 吗?