- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试使用 this 在 C++ 中实现多线程 LRU 缓存文章作为提示或灵感。它适用于 Go,但所需的概念或多或少也存在于 C++ 中。本文建议在散列表和链表周围使用带有共享互斥锁的细粒度锁定。
所以我打算用 std::unordered_map
写一个缓存, std::list
并使用 std::shared_timed_mutex
锁定.我的用例包括几个线程 (4-8) 使用此缓存作为拼写错误的单词和相应可能的更正的存储。缓存的大小约为 10000-100000 个项目。
但是我在几个地方读到,使用共享互斥锁而不是普通互斥锁几乎没有意义,而且速度更慢,尽管我找不到一些带有数字的真实基准或至少在何时使用和何时不使用的模糊指南共享互斥锁。而其他来源建议在您有并发读取器或多或少超过并发写入器时使用共享互斥锁。
std::shared_timed_mutex
比较好比普通std::mutex
?读者/阅读人数应该多于作者/写作人数多少次?我当然知道这取决于很多因素,但是我应该如何决定使用哪个? std::shared_mutex
(来自 C++17)与定时相比在性能上有什么不同吗? 最佳答案
- When is it better to use an
std::shared_timed_mutex
than a plainstd::mutex
? How many times should readers/reads outnumber writers/writes? Of course I get that it depends on many factors, but how should I make a decision which one to use?
std::shared_mutex
,
std::shared_timed_mutex
)优于普通锁(
std::mutex
,
std::timed_mutex
)的情况很少见。它们确实存在,但就个人而言,我自己从未遇到过。
- Maybe it's platform-dependent and some platform implementations are worse than others? (we use Linux and Windows as targets, MSVC 2017 and GCC 5)
shared_mutex
有一个老问题Boost (
#11798 - Implementation of boost::shared_mutex on POSIX is suboptimal ) 中的实现。但是我不清楚这个实现是否可以改进,或者它是否只是一个不太适合读/写锁的例子。
- Does it make sense to implement cache locking as described in the article?
std::list
请记住,它通常涉及内存分配,当您持有 key 时应该避免这种分配。最好在获取锁之前分配内存,因为内存分配很昂贵。
ConcurrentLRUCache
LRU 列表也使用链表(但不是
std::list
),而
tbb::concurrent_hash_map
对于映射本身(来自英特尔的并发散列映射实现)。请注意,对于 LRU 列表更新的锁定,它们并没有像 Go 实现中那样采用读/写方法,而是使用了一个简单的
std::mutex
排他锁。
ConcurrentScalableCache
)建立在
ConcurrentLRUCache
之上.他们使用分片来提高可扩展性。缺点是 LRU 属性只是近似值(取决于您使用的分片数量)。在某些可能会降低缓存命中率的工作负载中,这是一个很好的技巧,可以避免所有操作都必须共享相同的锁。
- Does std::shared_mutex (from C++17) make any difference in performance compared to a timed one?
std::shared_timed_mutex
.但是如果你不需要它,你可以简单地使用
std::shared_mutex
,它必须做更少的工作,因此永远不会变慢。
关于c++ - 什么时候 std::shared_timed_mutex 比 std::mutex 慢,什么时候(不)使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50972345/
新的 std::shared_timed_mutex 允许两种类型的锁:共享锁和排他锁。 如果一个人持有共享锁,有没有办法将它原子交换(“升级”)为独占锁?换句话说,给定以下代码,我怎样才能避免非原子
我有一个在 8 个线程之间共享的哈希表(我有一个 8 核 PC),每个线程在哈希表中读取和写入。 在示例 1 中,我使用了经典的互斥锁,所有 8 个核心都处于 100%在示例 2 中,我使用了 sha
我正在尝试使用 Eclipse CDT 4.5.0 在 OS X 10.11.2 上使用来自 C++ 14 的新 shared_timed_mutex 结构。 Xcode 是 7.2。我正在使用具有以
我正在尝试使用 this 在 C++ 中实现多线程 LRU 缓存文章作为提示或灵感。它适用于 Go,但所需的概念或多或少也存在于 C++ 中。本文建议在散列表和链表周围使用带有共享互斥锁的细粒度锁定。
我是一名优秀的程序员,十分优秀!