【发布时间】:2014-10-01 06:16:36
【问题描述】:
多个(2 个或更多)客户端线程需要以高频率运行,但后台服务线程每 1 分钟更新一次主线程使用的变量。
什么是在更新的小时刻锁定变量(实际上是向量)的最佳方法,而对客户端线程的影响很小。
在“正常”(无后台线程)操作期间无需保护向量,因为所有线程都使用这些值。
boost::thread 与无限循环一起使用以更新向量并休眠 60 秒。
【问题讨论】:
标签: c++ multithreading boost
多个(2 个或更多)客户端线程需要以高频率运行,但后台服务线程每 1 分钟更新一次主线程使用的变量。
什么是在更新的小时刻锁定变量(实际上是向量)的最佳方法,而对客户端线程的影响很小。
在“正常”(无后台线程)操作期间无需保护向量,因为所有线程都使用这些值。
boost::thread 与无限循环一起使用以更新向量并休眠 60 秒。
【问题讨论】:
标签: c++ multithreading boost
这似乎是一个读写器锁的好时机。所有客户端都将向量锁定为只读,后台服务线程将其锁定为每分钟只写一次。
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>
也就是说,根据您的实际平台和 CPU 型号,您可能会更幸运地使用原子变量。
如果它是一个原始值,只需使用boost::atomic_int 或类似的就可以了。对于向量,请考虑使用 std::shared_ptr (具有原子支持)。参见例如
您也可以不使用动态分配(尽管您已经在使用向量),方法是使用两个向量,并以原子方式切换对“实际”版本的引用。
【讨论】: