【发布时间】:2013-05-10 22:19:52
【问题描述】:
问题
- 我有一个目录
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中一个名为K的文件,其内容等于either@ 987654336@ 或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>这样的东西,但界面显示每个可能的键同时具有关联的互斥锁。
- 想像
【问题讨论】:
-
如果您不关心两个并发写入,或者一个写入进入而另一个正在进行中,您可能想要使用原子标志而不是互斥锁。
标签: c++ data-structures asynchronous concurrency mutex