【问题标题】:boost lock variable vector during update在更新期间提升锁定变量向量
【发布时间】:2014-10-01 06:16:36
【问题描述】:

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

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

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

boost::thread 与无限循环一起使用以更新向量并休眠 60 秒。

【问题讨论】:

    标签: c++ multithreading boost


    【解决方案1】:
    1. 这似乎是一个读写器锁的好时机。所有客户端都将向量锁定为只读,后台服务线程将其锁定为每分钟只写一次。

      • SharedLockable concept from c++14
      • 在 Boost Thread 中实现为 boost::shared_mutex

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

        允许同时调用lock()try_lock()try_lock_for()try_lock_until()timed_lock()lock_shared()try_lock_shared_for()try_lock_shared_until()try_lock_shared()和@9876543333@6。 /p>

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

      如果它是一个原始值,只需使用boost::atomic_int 或类似的就可以了。对于向量,请考虑使用 std::shared_ptr (具有原子支持)。参见例如

      您也可以不使用动态分配(尽管您已经在使用向量),方法是使用两个向量,并以原子方式切换对“实际”版本的引用。

    【讨论】:

    • sharedlockable 听起来很理想,基于描述“这是标准的多读/单写模型”thnx
    • 切换/交换引用似乎也很有意义。从而避免任何读锁定。
    • 嗯。如果向量大小发生变化,那就是个问题。
    • @GabeRainbow 怎么样?如果您持有过时的引用或以其他方式绕过向量类的公共接口,这只是一个问题。到现在为止,要提供更具体的有用建议,我们需要更多地了解您想要实现的具体目标(在功能层面上)。
    • 可行,但需要更长的锁定期——对于读者来说。希望影响不大。谢谢
    猜你喜欢
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    • 2013-07-13
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多