多个(2 个或更多)客户端线程需要以高频率运行,但后台服务线程每 1 分钟更新一次主线程使用的变量。
什么是在对客户端线程影响很小的更新时刻锁定变量(实际上是 vector )的最佳方法。
在“正常”(无后台线程)操作期间无需保护 vector ,因为所有线程都使用这些值。
boost::thread 与无限循环一起使用以更新 vector 并休眠 60 秒。
最佳答案
这似乎是读写器锁的好时机。所有客户端锁定 vector 只读,后台服务线程每分钟锁定一次只写。
-
SharedLockable
concept from c++14 在 Boost Thread 中实现为
boost::shared_mutex
The class
boost::shared_mutex
provides an implementation of a multiple-reader / single-writer mutex. It implements theSharedLockable
concept.Multiple concurrent calls to
lock()
,try_lock()
,try_lock_for()
,try_lock_until()
,timed_lock()
,lock_shared()
,try_lock_shared_for()
,try_lock_shared_until()
,try_lock_shared()
andtimed_lock_shared()
are permitted.
-
也就是说,根据您的实际平台和 CPU 型号,使用原子变量可能会更幸运。
如果它是原始值,只需使用
boost::atomic_int
或类似的就可以了。对于 vector ,请考虑使用 std::shared_ptr(具有原子支持)。参见示例您也可以不使用动态分配(尽管您已经在使用 vector ),方法是使用两个 vector ,并自动切换对“实际”版本的引用。
关于c++ - 在更新期间 boost 锁定变量 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26135195/