C++ 更新期间的boost lock变量向量

C++ 更新期间的boost lock变量向量,c++,multithreading,boost,C++,Multithreading,Boost,几个(2个或更多)客户端线程需要以高频率运行,但后台服务线程每1分钟更新一次主线程使用的变量 在更新的小时刻锁定变量(实际上是向量)的最佳方法是什么,对客户端线程的影响很小 在“正常”(无后台线程)操作期间不需要保护向量,因为所有线程都使用这些值 线程与无尽的while循环一起使用,以更新向量并休眠60秒 这似乎是一个读者-作者锁定的好时机。所有客户端都将向量锁定为只读,后台服务线程每分钟仅将其锁定一次以进行写入 它在Boost线程中实现为Boost::shared_mutex 类boost

几个(2个或更多)客户端线程需要以高频率运行,但后台服务线程每1分钟更新一次主线程使用的变量

在更新的小时刻锁定变量(实际上是向量)的最佳方法是什么,对客户端线程的影响很小

在“正常”(无后台线程)操作期间不需要保护向量,因为所有线程都使用这些值

线程与无尽的while循环一起使用,以更新向量并休眠60秒

  • 这似乎是一个读者-作者锁定的好时机。所有客户端都将向量锁定为只读,后台服务线程每分钟仅将其锁定一次以进行写入

    • 它在Boost线程中实现为
      Boost::shared_mutex

      boost::shared_mutex
      提供了多读/单写互斥体的实现。它实现了
      SharedLockable
      概念

      多次并发调用
      lock()
      try\u lock()
      try\u lock\u for()
      try\u lock\u直到()
      timed\u lock()
      try\u lock\u shared\u for()
      try\u lock\u shared\u直到(),
      try\u lock\u shared()
      timed\u lock\u shared
      是允许的

  • 也就是说,根据您的实际平台和CPU型号,使用原子变量可能会更幸运

    如果它是一个原语值,只需使用
    boost::atomic_int
    或类似工具即可。对于向量,考虑使用STD::SysDypPTR(它具有原子支持)。参见例如

    您也可以不使用动态分配(尽管您已经在使用vector),而是使用两个vector,并以原子方式将引用切换到“实际”版本


  • sharedlockable听起来很理想,因为“这是标准的多读/单写模式”thnx切换/交换参考似乎也有意义。从而避免了任何读锁定。如果向量大小改变,这是个问题。@GabeRainbow怎么会这样?只有当您持有过时的引用或以其他方式绕过vector类的公共接口时,这才是一个问题。到目前为止,为了给出更具体有用的建议,我们需要更多地了解您(在功能级别上)想要实现的目标。这是可行的,但需要更长的锁定期——对于读者来说。希望影响不大。谢谢