【发布时间】:2017-10-25 01:11:06
【问题描述】:
我有一个应用程序,我想在其中跨多个线程记忆函数的结果。我想要的代码的单线程版本如下所示:
int memoized_method(int arg) {
int result;
if (memo.count(arg)) {
result = memo[arg];
}
else {
result = unmemoized_method(arg);
memo[arg] = result;
}
return result;
}
其中memo 是unordered_map。据我了解,unordered_map 为并发读取和单线程写入提供了保证。我的挑战是,理想情况下,我需要在这些模式之间交替。这使得获得多线程代码的全部优势变得具有挑战性。
我将提供代码以使困境更加清晰。我可以像这样使用mutex:
mutex mtx;
int memoized_method(int arg) {
int result;
mtx.lock();
if (memo.count(arg)) {
result = memo[arg];
}
else {
result = unmemoized_method(arg);
memo[arg] = result;
}
mtx.unlock();
return result;
}
我不想要这个选项,因为每次我访问备忘录时它都需要关键锁,这会大大降低我的特定应用程序的速度。或者,我可以这样做:
mutex mtx;
int memoized_method(int arg) {
int result;
if (memo.count(arg)) {
result = memo[arg];
}
else {
mtx.lock();
result = unmemoized_method(arg);
memo[arg] = result;
mtx.unlock();
}
return result;
}
但这不是线程安全的,因为memo 最终可能会在其他线程正在访问它时重新散列。
基本上,我希望能够仅在线程位于“else”部分时锁定对代码“if”部分的访问。我还需要能够让“if”块中的任何线程在它被锁定时完成它。我看不到使用mutex 解决此问题的方法,因为mutex 与一个特定的代码块相关联。有没有我没有注意到的棘手方法?或者还有其他我应该注意的锁类型吗?
【问题讨论】:
-
您是否针对特定平台?
-
它必须在 Linux 和 Mac 上工作
标签: c++ multithreading concurrency