Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: ManagedThreadId повторяется - исключения в RWLSlim Добавлено: 16.04.12 14:15  

Автор вопроса:  Programmer
Добрый день!

У меня ReaderWriterLockSlim используется в одном потоке (Read/ExitRead).

А потом этот поток перестает существовать и появляется новый с таким же Id (таково мое предположение). Проконтролировать это практически невозможно, так как моя dll-ка работает из под другой программы, которая все и контролирует.

Когда я пытаюсь выполнить EnterUpgradableReadLock слим почему-то "думает", что для потока с этим Id уже открыт Read и создает исключение, хотя все Read я закрываю в try-finally.

Ошибка "плавающая", возникает примерно в одном запуске из десяти.

Пользуюсь моновским вариантом слима, так что думаю, что решил проблему, заменив внутри него Dictionary (где он хранит состояния потоков) с ключом ManagedThreadId на Dictionary с Thread.CurrentThread в качестве ключа.

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

Посоветуйте, может быть есть более оптимальное решение? Или я вообще что-то не то делаю? Я перепроверил несколько раз, что каждый EnterRead закрывается ExitRead в try-finally.

Ответить

  Ответы Всего ответов: 7  

Номер ответа: 1
Автор ответа:
 Programmer



Вопросов: 71
Ответов: 246
 Профиль | | #1 Добавлено: 16.04.12 14:20
SupportRecursion включен.

Вот логи исключения:
  1.  
  2. LockRecursionException: The current thread HasFlag already entered read mode at FlexibleGameServer
  3. Stack:
  4.   at System.Threading.ReaderWriterLockSlim2.TryEnterUpgradeableReadLock (Int32 millisecondsTimeout) [0x00000] in <filename unknown>:0
  5.   at System.Threading.ReaderWriterLockSlim2.EnterUpgradeableReadLock () [0x00000] in <filename unknown>:0
  6.   at FlexibleGameServer.Unity3d.FGSServer.FixedUpdate () [0x00000] in <filename unknown>:0
  7. Inner exception: null
  8. CurrentReadCount 1
  9. RecursiveReadCount 1
  10. RecursiveUpgradeCount -1
  11. RecursiveWriteCount 0
  12. IsReadLockHeld True
  13. IsUpgradeableReadLockHeld False
  14. IsWriteLockHeld False
  15.  
  16. UnityEngine.Debug:Log(Object)
  17. ChatLogTextWriter:WriteLine(String)
  18. System.Console:WriteLine(String)
  19. FlexibleGameServer.Unity3d.FGSServer:FixedUpdate()
  20.  
  21.  
  22. LockRecursionException: Exception of type 'System.Threading.LockRecursionException' was thrown. at FlexibleGameServer
  23. Stack:
  24.   at System.Threading.ReaderWriterLockSlim2.CheckRecursionAuthorization (LockState ctstate, LockState desiredState) [0x00000] in <filename unknown>:0
  25.   at System.Threading.ReaderWriterLockSlim2.CheckState (System.Threading.ThreadLockState state, Int32 millisecondsTimeout, LockState validState) [0x00000] in <filename unknown>:0
  26.   at System.Threading.ReaderWriterLockSlim2.TryEnterUpgradeableReadLock (Int32 millisecondsTimeout) [0x00000] in <filename unknown>:0
  27.   at System.Threading.ReaderWriterLockSlim2.EnterUpgradeableReadLock () [0x00000] in <filename unknown>:0
  28.   at FlexibleGameServer.Unity3d.FGSServer.FixedUpdate () [0x00000] in <filename unknown>:0
  29. Inner exception: null
  30. CurrentReadCount 1
  31. RecursiveReadCount 1
  32. RecursiveUpgradeCount -1
  33. RecursiveWriteCount 0
  34. IsReadLockHeld True
  35. IsUpgradeableReadLockHeld False
  36. IsWriteLockHeld False
  37.  
  38. UnityEngine.Debug:Log(Object)
  39. ChatLogTextWriter:WriteLine(String)
  40. System.Console:WriteLine(String)
  41. FlexibleGameServer.Unity3d.FGSServer:FixedUpdate()

Ответить

Номер ответа: 2
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #2 Добавлено: 01.05.12 01:00
Сделай пример минимального размера на котором воспроизводится эта ошибка, я могу посмотреть.
Без кода вообще говорить не о чем.

Ответить

Номер ответа: 3
Автор ответа:
 Programmer



Вопросов: 71
Ответов: 246
 Профиль | | #3 Добавлено: 05.05.12 20:45
Спасибо, проблема уже решена :)

Как я уже говорил, ошибка возникала не постоянно и воспроизвести её проблематично. Сейчас вроде пропала, после всех исправлений.

А код - ReaderWriterLockSlim из Mono, адаптированный под MS .NET (да, и такое бывает).

Вот моновский оригинал https://github.com/mosa/Mono-Class-Libraries/blob/master/mcs/class/System.Core/System.Threading/ReaderWriterLockSlim.cs

Ответить

Номер ответа: 4
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #4 Добавлено: 06.05.12 18:12
А чем не угодил ReaderWriterLockSlim из .NET Framework?
http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim(VS.90).aspx

Ответить

Номер ответа: 5
Автор ответа:
 Programmer



Вопросов: 71
Ответов: 246
 Профиль | | #5 Добавлено: 08.05.12 14:39
Фреймворк приложения, которое использует мою библиотеку, не поддерживает этот класс.

Ответить

Номер ответа: 6
Автор ответа:
 Programmer



Вопросов: 71
Ответов: 246
 Профиль | | #6 Добавлено: 26.05.12 21:29
Нашел более корректное решение.

Просто закомментируйте в этом https://github.com/mosa/Mono-Class-Libraries/blob/master/mcs/class/System.Core/System.Threading/ReaderWriterLockSlim.cs

  1. int tid = Thread.CurrentThread.ManagedThreadId;
  2.  
  3. if (tid < fastStateCache.Length)
  4. return fastStateCache[tid] == null ? (fastStateCache[tid] = new ThreadLockState ()) : fastStateCache[tid];



Проблема, скорее всего, в использовании старой версии Mono, где ManagedThreadId действительно не уникален. Вот о баге http://lists.ximian.com/pipermail/mono-bugs/2007-September/061178.html

Баг имел место в Unity 3D.

Ответить

Номер ответа: 7
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #7 Добавлено: 26.05.12 22:48
имхо, Mono и есть одна сплошная бага..

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам