gpt4 book ai didi

c++ - 使用 C++ 的缓存锁定模式

转载 作者:搜寻专家 更新时间:2023-10-31 01:17:49 25 4
gpt4 key购买 nike

我想知道是否有比简单锁更好的缓存锁定方案:

Mutex lock;
get(key) {
LockGuard(lock);

if (cache.has(key)) {
return cache[key];
} else {
data = remoteclient.getslow();
cache[key] = data;
return data;
}
}

假设您有很多相同的请求,那么您每次都在序列化对 get() 的访问。可以使用 ReadWriter 锁做一些更智能的事情吗?

即如果你做这样的事情会怎样:

ReadersWritersLock lock;
get(key) {
{
ReadLockGuard(lock);
if (cache.has(key)) {
return cache[key];
}
}
WriteLockGuard(lock);
data = remoteclient.getslow();
cache[key] = data;
return data;
}
}

现在这将允许多个用户在缓存命中的情况下同时使用 get()。但是,如果两个用户大约同时到达第一个 get() ,则他们可能都会尝试进入代码的第二部分以获取数据。这看起来是个好主意吗?

还有其他优化此类代码的想法吗?

最佳答案

我不喜欢发布的代码的一件事是,在两个片段中,调用

remoteclient.getslow();

在缓存被锁定时被调用。如果 remoteclient.getslow() 实际上可能需要很长时间才能返回(顾名思义),那么任何其他试图访问缓存的线程最终都会被阻塞很长时间(即直到 getslow() 返回并且调用它的线程释放锁)......即使他们只对缓存中已经存在的不相关数据感兴趣!

为了避免这种情况,我会改为在 LockGuard 的范围之外调用 remoteclient.getslow()(即缓存解锁时)。然后,在 remoteclient.getslow() 返回结果后,我将重新锁定缓存并使用检索到的值更新缓存。这样缓存就不会长时间锁定。

(当然,这样做确实开启了多个线程为同一数据项调用 remoteclient.getslow() 的可能性,如果它们都决定在大约同一时间需要相同的数据……但这可能是一个可以接受的副作用。或者如果不是,您可以设计一种机制来指示特定的缓存值正在被检索并让其他线程阻塞直到检索完成......如果这值得额外的复杂性适合你。这可能需要条件变量等才能正确执行)

关于c++ - 使用 C++ 的缓存锁定模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7774335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com