Это теоретический вопрос; У меня нет реальной проблемы для решения, я просто хочу понять, как это работает.Почему программа ReaderWriterLock не запускается автоматически при закрытии потока пользователей?
Я узнал, что если нить не позволяет выйти из ReaderWriterLock, тогда другие потоки не смогут получить блокировку даже после завершения исходного потока. Есть ли веская причина, почему ReaderWriterLock не предоставляет блокировку ожидающим потокам, как только поток, которому принадлежит блокировка, завершается?
Вот тестовый пример, демонстрирующий проблему.
static void Main(string[] args)
{
ReaderWriterLockSlim readerWriterLock = new ReaderWriterLockSlim();
Thread t1 = new Thread((a) =>
{
readerWriterLock.EnterReadLock();
// this thread omits to Exit the lock....
});
Thread t2 = new Thread((a) =>
{
readerWriterLock.EnterWriteLock();
});
t1.Start();
t2.Start();
// wait for all threads to finish
t1.Join();
t2.Join();
}
В контексте потока, который разбился, я согласен, что предполагая, что ресурс, который он заблокировал, теперь находится в чистом состоянии, был бы рискован. Но в контексте нормального завершения потока я считаю, что такое предположение было бы безопасным. Что касается производительности, они могут обеспечить две реализации: тот, который у нас есть сейчас, и более медленный, но более умный, который реализует автоматический выпуск. Во всяком случае, благодарю вас за ваш ответ, я думаю, что вы объяснили, действительно, причина, почему это делается именно так. – Sylvain
Re: нормальное завершение потока, вы можете рассмотреть использование шаблона RAII для блокировок, что поможет обеспечить освобождение блокировки при выходе из некоторой области. В C# вы можете использовать ключевое слово _lock_ (для обычных блокировок) или _try/finally_ блоков (для вашего ReaderWriterLock), чтобы обеспечить освобождение блокировок при выходе из области действия. Опять же, это не поможет вам, если поток потерпел крушение, или если он вызвал функцию нисходящего выхода более низкого уровня, но это поможет снизить риск блокировок от ошибок программирования, когда вы забудете освободить блокировку на некотором запутанном пути кода , – 0xfe