大型对象的线程间通信的最佳实践

时间:2014-10-23 17:48:23

标签: c++ multithreading caching boost lock-free

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

考虑以下线程间通信:

  • 线程#1:处理从网络事件接收的大对象,称之为A。这些数据显着改变了其内部状态。
  • 线程#2:需要知道对象A的当前,改变的内部状态,以做出一些决定。

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

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

  2. 线程#1将对象副本的某些版本推送到lockfree队列,以便线程#2可以直接接收它,使用它,并在完成后处理副本。

  3. 方法#1避免了方法#2所需的大型对象的昂贵副本,但它总是需要锁定/解锁,如果我理解正确,则需要额外的L3缓存命中。

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

1 个答案:

答案 0 :(得分:2)

这实际上取决于线程2尝试从线程1访问多少信息。如果它需要完全访问所有线程1的对象/内存,那么是的,复制所有这些代价高昂并且我会锁定。但这也取决于时间。如果所有线程2需要检查一个状态,就像一个变量,我会让线程1更新一个更小的对象,它可以在没有锁的情况下共享,因为线程2只读取而线程1只写。

如果线程2只读取,你可能甚至不需要锁定,并且在更新数据状态时可以做出决定。