问题
- 我有一个目录
D
,我想将(K, V)
它们放入 void save(K, V)
K
将包含内容的文件名保存V
到目录D
- 具有“即发即弃”的语义 - 函数可能在将文件实际保存到磁盘之前返回
- 目录是定义函数
D
的类的字段C
save
- 调用
void save(K, V)
应该同时运行tbb::task
用于并发- 同一密钥的两个文件写入不能同时运行
- 也就是说,如果两个线程同时调用
save(K, V1)
,save(K, V2)
结果应该是D
named中的文件,其K
内容等于or(但未损坏)V1
V2
计划的方法
H
选择一个映射K
到一个哈希函数std::size_t
- 选择一个整数
N > 1
- 给类
C
一个互斥体数组tbb::mutex mutex_map[N]
void save(K, V)
等待获取锁mutex_map[H(K) % N]
以执行其文件写入
问题
- 这是一个明智的做法吗?
- 你能想出一个可能比这更有优势的替代方案吗?
- 是否有一些
tbb
数据结构已经封装了互斥映射的这个概念?- 想想类似的东西,
std::map<TKey, tbb::mutex>
但是界面给出了每个可能的键同时具有关联互斥锁的外观。
- 想想类似的东西,