c++ - 在更新期间 boost 锁定变量 vector

标签 c++ multithreading boost

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

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

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

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

最佳答案

  1. 这似乎是读写器锁的好时机。所有客户端锁定 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 the SharedLockable 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() and timed_lock_shared() are permitted.

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

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

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

关于c++ - 在更新期间 boost 锁定变量 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26135195/

相关文章:

c++ - `clock()` 给出通常的时钟而不是 CPU 时钟

c++ - 在 XCode 4.1 中禁用有关 Boost header 的警告

java - 使用 boost::posix_time::ptime 序列化 XML 表示创建 Java 对象

c++ - 更好的可读性和简单性与更高的复杂性和编程速度,该选择什么?

c++ - 为链表创建 "void InsertNode(int a)"和 "void DeleteNode(int a)"

C++ 将 int 和 string 转换为 char*

python - 超时后杀死Python中的子进程

python - 如何使用 cython 将 python 类公开给 C++

c# - 在 Thread.Sleep() 期间保持 UI 响应

boost - 如何使用 boost.asio 创建一个简单的服务器/客户端应用程序?