【发布时间】:2010-01-26 13:46:41
【问题描述】:
我正在为 C++ 中的数据缓存编写模板库,其中可以进行并发读取和并发写入,但不能使用相同的键。该模式可以用以下环境来解释:
- 用于缓存写入的互斥锁。
- 缓存中每个键的互斥锁。
这样,如果一个线程从缓存中请求一个键并且不存在,则可以为该唯一键启动锁定计算。与此同时,其他线程可以检索或计算其他键的数据,但尝试访问第一个键的线程会被锁定等待。
主要的约束是:
- 切勿同时计算键的值。
- 可以同时计算 2 个不同键的值。
- 数据检索不能锁定其他线程从其他键检索数据。
我的其他限制但已经解决的是:
- 固定(在编译时已知)最大缓存大小以及基于 MRU(最近使用)的抖动。
- 按引用检索(隐含互斥共享计数)
我不确定为每个键使用 1 个互斥锁是实现此目的的正确方法,但我没有找到任何其他实质上不同的方法。
您是否知道实现此功能的其他模式,或者您认为这是一个合适的解决方案?我不喜欢拥有大约 100 个互斥锁的想法。 (缓存大小约为 100 个键)
【问题讨论】:
-
也许第一句话说明了这一点,但我不清楚并发限制是否适用于对同一对象的读取。换句话说,两个线程可以同时使用一个现有的键吗?
-
是的,如果缓存中已经存在,2 个线程应该同时读取同一个键。否则,如果键不存在,则一个线程必须获得键上的锁,而第二个线程必须等待另一个线程完成计算并将对象添加到缓存中。同时允许其他线程从其他键中读取。这可以通过缓存的多读/单写互斥锁来完成;当锁定写入时,一个新条目被添加到缓存中。你可以认为是一个元组
。键互斥锁被锁定,然后缓存互斥锁被释放。
标签: c++ caching thread-safety