Страница: 1 |
Страница: 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 включен.
Вот логи исключения:
Номер ответа: 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
Проблема, скорее всего, в использовании старой версии 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 и есть одна сплошная бага..