【发布时间】:2016-03-31 10:04:07
【问题描述】:
我为资源访问维护了一个 ReaderWriterLockSlim 对象字典:(这里的示例代码很丑,只是让你明白我的目的)
static ConcurrentDictionary<string, ReaderWriterLockSlim> rwResourceLocks =
new ConcurrentDictionary<string, ReaderWriterLockSlim>();
并像这样使用:
if (ResourceStore.Exist("resourceID")) {
if (rwResourceLocks["resourceID"] == null) {
/* create a new lock in thread-safe way */
}
rwResourceLocks["resourceID"].EnderReadLock();
var rc = ResourceStore.GetResource("resourceID");
/* further use of rc... */
rwResourceLocks["resourceID"].ExitReadLock();
}
资源可以动态添加或删除,并且它们的生命周期是不可预测的(无法监控资源的删除),随着资源量的增长,rwResourceLocks 的大小也会增加,这将导致内存问题。有没有办法解决这个问题? (显然我不能简单地调用 rwResourceLocks.Clear() 来做到这一点)
我知道这有点复杂:(
【问题讨论】:
-
存在竞争条件:如果 2 个线程正在检查相同的不存在的
resourceID,那么它们都可能会尝试创建新锁。希望这不是问题,或者您已经意识到这一点。目前尚不清楚为什么需要锁才能访问资源。您可以通过实现缓存来加快访问速度(如果这是一个目标)。否则在不知道资源是否正在使用的情况下可以释放它吗?如果是,则再次缓存。存储每个资源的最后访问时间,检查(定期或添加新资源时),过期时免费。 -
因为这些资源不仅用于读取,而且有时会被修改,我会持有写锁以防止当时读取它。 (例如文件资源)
标签: c# thread-safety readerwriterlockslim readerwriterlock