在单独的线程中写入 std::map<K、V> 时需要读/写锁定



我在C++中实现了一个systemd服务,该服务在系统启动时自动启动。此服务的目标是获取系统资源,并通过API访问这些资源。

其中一个资源是cpu负载。我已经实现了一个单独的线程,它以设定的间隔(每秒(从"/proc/stat"读取信息,并同时根据这些读数计算cpu负载。读数存储在std::unordered_map<std::string, uint32_t>中,并且每当调用API时从主程序读取值。

我已经读到,在不同的线程中从同一个容器进行写入和读取时,我应该使用读/写锁。这个假设正确吗?

我将如何实现这样的读/写锁定?

通过指定键直接写入映射的值:my_map['some_key'] = value

如果我用读锁锁定容器,而单独的线程尝试同时写入,会发生什么?由于每秒都会写入新的值,这可能会有问题。

我读到,在不同线程中从同一容器进行写操作时,应该使用读/写锁。这个假设正确吗?

这不是唯一的选项,但在这种情况下这是一个不错的选择。基本锁可以工作,但速度会较慢(它会在这里串行读取,而读取需要较快,如果您的情况下写入较慢,这不是问题(。

如何实现这样的读/写锁?

在C++17中,有一个shared_mutex类实现了这样的机制。shared访问模式用于读取器,exclusive访问模式用于写入器。

如果我用读锁锁定容器,而单独的线程试图同时写入,会发生什么?

如果在容器中写入的线程没有锁定读写互斥体的写入锁,则存在导致未定义行为的竞争条件(例如崩溃(。有了读写锁,对容器的写入将是互斥的(即安全的(。相同的ting发生在读和写之间,但不发生在多次读之间。

最新更新