ReaderWriterLockSlim блокируется навсегда

Доброе время всем.

Моя проблема заключается в следующем:

многочисленные потоки ожидают события, чтобы получить блокировку чтения, один поток ожидает события, чтобы получить блокировку записи. В этот момент блокировка не удерживается никаким потоком.

0:173> !do 0x0000000001c679f8
Name:        System.Threading.ReaderWriterLockSlim
...
Value Name
1 fIsReentrant
0 myLock
1 numWriteWaiters
28 numReadWaiters
0 numWriteUpgradeWaiters
0 numUpgradeWaiters
0 fNoWaiters
-1 upgradeLockOwnerId
-1 writeLockOwnerId
000000000381eb38 writeEvent
00000000035a32e0 readEvent
0000000000000000 upgradeEvent
0000000000000000 waitUpgradeEvent
9 lockID
0 fUpgradeThreadHoldingRead
1073741824 owners
0 fDisposed

0:173> .formats 0n1073741824
Evaluate expression:
  Hex:     00000000`40000000

Из ReaderWriterLockSlim.cs:

private const uint WAITING_WRITERS = 0x40000000;

Сначала я сделал предположение о том, что поток прерывает создание такого рода повреждения, чтобы заблокировать состояние. Проблему легко воспроизвести: http://chabster.blogspot.com/2013/07/a-story-of-orphaned-readerwriterlockslim.html.

Я заставил замки выглядеть как

try {} finally { lock.EnterXYZ(); }
try { /* resource usage code */ } finally { lock.ExitXYZ(); }

и был уверен, что прерывания могут произойти только в try { /* код использования ресурса */ }.

Теперь у меня есть еще одна свалка с той же проблемой, и у меня закончились идеи.

Я должен сказать, что это происходит время от времени в 24 основных средах. Может ли это быть ошибка RWLS в ht/milticore/ многопроцессорных системах? Я вижу, что класс ReaderWriterLockSlim обновляет свои члены без взаимосвязанных инструкций, что может быть потенциальной проблемой в многоядерных средах.

PS: Я хотел бы услышать от автора ReaderWriterLockSlim Джо Даффи, но не смог связаться с ним по электронной почте.

0 ответов

Другие вопросы по тегам