在更新期间提升锁定变量矢量

boost lock variable vector during update

本文关键字:锁定 变量 更新      更新时间:2023-10-16

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

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

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

boost::线程与一个无休止的while循环一起使用,以更新向量并睡眠60秒。

  1. 这似乎是一个锁定读写器的好时机。所有的客户端锁定矢量只进行读取,后台服务线程每分钟只锁定一次写入。

    • c++14中的SharedLockable概念
    • 在Boost线程中实现为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()timed_lock_shared()进行多个并发调用。

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

    如果它是一个基元值,那么只使用boost::atomic_int或类似的值就可以了。对于向量,可以考虑使用std::shared_ptr(它有原子支持)

    • 使用std::unique_ptr/std::shared_ptr确认线程安全性

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