【发布时间】:2014-08-15 18:33:00
【问题描述】:
我有一个std::map,它将被多个线程修改,并且我有一个互斥锁来锁定这些写入。但是,有时必须在长时间运行的操作期间使用映射,并且在整个操作期间保持锁定以阻塞所有这些写入是不好的。
对此我有两个问题:
- 在其他线程写入原始映射时对映射副本执行该操作是否线程安全?
- 在其他线程对其进行变异时复制映射是否是线程安全的?
例如:
class Foo {
void writeToMap(Bar &bar, Baz &baz) {
// lock mutex
map[bar] = baz;
// unlock mutex
}
std::map<Bar, Baz> getMapCopy() {
// lock mutex (Is this necessary?)
std::map<Bar, Baz> copy (map);
// unlock mutex
return copy;
}
std::map<Bar, Baz> map;
};
void expensiveOperation(Foo &f) {
std::map<Bar, Baz> mapCopy = f.getMapCopy();
// Can I safely read mapCopy?
}
【问题讨论】:
-
您正在返回对局部变量的引用。这不起作用。如果按值返回就OK了。
标签: c++ multithreading stl