Do các vấn đề về hiệu suất, tôi đã thay thế ReaderWriterLock
bằng ReaderWriterLockSlim
. Tôi gặp sự cố, do mã hoạt động chính xác khi sử dụng RWL.Thay thế ReaderWriterLock bằng ReaderWriterLockSLim - các sự cố
Như bạn thấy, đôi khi MethodA
(mà có được một ghi khóa) gọi phương pháp khác (mà có được một đọc khóa). Phương pháp thứ hai cũng được gọi từ những nơi khác nhau, vì vậy không phải lúc nào cũng có va chạm khóa. Trước đây, khóa AcquiringRead không gây ra vấn đề đó.
Có giải pháp nào ngoại trừ việc đặt "nếu IsRWheld" không?
Vấn đề là một cái gì đó như thế:
class Avacado
{
ReaderWriterLockSlim _lock = new ReaderWriterLockSlim();
void MethodA()
{
_lock.TryEnterWriteLock(-1);
LockedList.Add(someItem)
var result = MethodX();
_lock.ExitWriteLock();
}
object MethodX()
{
//if called from MethodA, it will throw an exception
_lock.TryEnterReadLock(-1);
//...some stuff with LockedList...
var result = LockList.Something();
_lock.ExitReadLock();
return result;
}
}