在更新期间提升锁定变量矢量
boost lock variable vector during update
多个(2个或更多)客户端线程需要以高频率运行,但后台服务线程每1分钟更新一次主线程使用的变量。
什么是在更新的小时刻锁定变量(实际上是向量)的最佳方法,对客户端线程的影响很小。
在"正常"(无后台线程)操作期间不需要保护向量,因为所有线程都使用这些值。
boost::线程与一个无休止的while循环一起使用,以更新向量并睡眠60秒。
-
这似乎是一个锁定读写器的好时机。所有的客户端锁定矢量只进行读取,后台服务线程每分钟只锁定一次写入。
- 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()
进行多个并发调用。
- c++14中的
-
也就是说,根据您的实际平台和CPU模型,使用原子变量可能会更幸运。
如果它是一个基元值,那么只使用
boost::atomic_int
或类似的值就可以了。对于向量,可以考虑使用std::shared_ptr(它有原子支持)- 使用std::unique_ptr/std::shared_ptr确认线程安全性
您也可以不使用动态分配(尽管您已经在使用向量),方法是使用两个向量,并原子地将引用切换到"实际"版本。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 如何杀死被条件变量锁定的线程?
- 使用文件锁定的进程之间的条件变量
- 托管语言是否锁定本机库的刷新和重新加载变量?
- 信号在条件变量上而无需锁定锁
- 为什么条件变量需要锁定(因此也需要静音)
- C 98 Mutex中共享数组的锁定变量
- 带条件变量的升压锁定机制
- 在更新期间提升锁定变量矢量
- 在C++Builder 10中加载DLL时,变量或安全数组被锁定
- C++:Boost::互斥锁分别锁定同一作用域中的多个变量
- pthread互斥锁定和解锁每个变量
- 如果我锁定变量,我是否必须将复杂类型标记为“易失性”?
- 自动锁定自由更新2个变量
- thread_local变量需要使用互斥锁来锁定
- 如何避免互斥变量被同一线程锁定两次
- 如果我只需要变量在其他线程中的值,我应该在一个线程中锁定变量吗?如果我不需要它为什么它有效?
- 快速锁定大量读取的变量,这些变量可能偶尔从另一个线程更改
- 我可以同时锁定多个变量吗?