我需要非常关注当前多线程项目中的速度/延迟。
考虑以下线程间通信:
- 线程 #1:处理一个大对象,称之为
A
,它从网络事件中接收。此数据会显着改变其内部状态。 - 线程 #2:需要了解对象
A
的当前、已更改的内部状态,以做出一些决策。
我基本上可以想到两种方法来进行:
Thread #2 有一个指向对象
A
的指针,并且当发出信号时(例如,通过不断检查通过无锁队列发送的小对象或通过检查共享原子 bool),Thread #2 锁定对象A
并读取它。线程 #1 将某个版本的对象拷贝推送到无锁队列中,这样线程 #2 就可以简单地直接接收它、使用它,并在它完成时处理该拷贝。
方法 #1 避免了方法 #2 所需的昂贵的大型对象拷贝,但它总是需要锁定/解锁,并且如果我理解正确的话,还需要额外的 L3 缓存命中。
我知道可能没有任何简单的性能答案...我可能只需要进行基准测试。我最感兴趣的是最佳实践建议。具体来说,我想知道考虑缓存内存级别的问题,以了解信息是如何在内部传递和复制的。
最佳答案
这实际上取决于线程 2 试图从线程 1 访问多少信息。如果它需要完全访问线程 1 的所有对象/内存,那么是的,复制所有这些是昂贵的,我会做一个锁。但这也取决于时间。如果线程 2 需要的只是检查一个状态,比如一个变量,我会让线程 1 更新自身外部的一个较小的对象,该对象可以在没有锁的情况下共享,因为线程 2 仅读取而线程 1 仅写入。
此外,如果线程 2 仅读取并且可以在更新时对数据状态做出决定,那么您甚至可能不需要锁定。
关于c++ - 大对象线程间通信的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26534201/