Вопросы о ReaderWriterLockSlim. Я использую readerwriterlockslim для чтения и записи, но, наконец, показываю запись в консоли. Почему? - PullRequest
0 голосов
/ 17 февраля 2020

это код:

class program
{
    static ReaderWriterLockSlim rwLock = new ReaderWriterLockSlim();
    static void Main(string[] args)
    {
        for (int i = 0; i < 2; i++)
        {
            Task.Factory.StartNew(Read);
        }
        for (int i = 0; i < 1; i++)
        {
            Task.Factory.StartNew(Write);
        }
        Console.Read();
    }

    static void Read()
    {
        while (true)
        {
            rwLock.EnterReadLock();;
            Thread.Sleep(100);
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}  reading");
            rwLock.ExitReadLock();
        }
    }
    static void Write()
    {
        while (true)
        {
            rwLock.EnterWriteLock();
            Thread.Sleep(3000);
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} writing");
            rwLock.ExitWriteLock();
        }
    }
}

Я хочу протестировать ReaderWriterLockSlim, результат, который я ожидаю, поочередно читается и записывается в консоли, но, наконец, запись только в консоли.

Здесь результат:

5 reading 2020/2/17 18:24:36
4 reading 2020/2/17 18:24:36
3 reading 2020/2/17 18:24:36
6 writing 2020/2/17 18:24:39
6 writing 2020/2/17 18:24:42
6 writing 2020/2/17 18:24:45
6 writing 2020/2/17 18:24:48
6 writing 2020/2/17 18:24:51
6 writing 2020/2/17 18:24:54
6 writing 2020/2/17 18:24:57
6 writing 2020/2/17 18:25:00
6 writing 2020/2/17 18:25:03
6 writing 2020/2/17 18:25:06

, но при использовании ReaderWriterLock, его альтернативное отображение. Вот результат:

4 reading 2020/2/17 18:30:22
3 reading 2020/2/17 18:30:22
5 reading 2020/2/17 18:30:22
6 writing 2020/2/17 18:30:25
4 reading 2020/2/17 18:30:25
3 reading 2020/2/17 18:30:25
5 reading 2020/2/17 18:30:25
6 writing 2020/2/17 18:30:28
4 reading 2020/2/17 18:30:29
5 reading 2020/2/17 18:30:29
3 reading 2020/2/17 18:30:29
6 writing 2020/2/17 18:30:32
4 reading 2020/2/17 18:30:32
5 reading 2020/2/17 18:30:32
3 reading 2020/2/17 18:30:32
6 writing 2020/2/17 18:30:35
5 reading 2020/2/17 18:30:35
3 reading 2020/2/17 18:30:35
4 reading 2020/2/17 18:30:35
6 writing 2020/2/17 18:30:38
5 reading 2020/2/17 18:30:45
3 reading 2020/2/17 18:30:45
4 reading 2020/2/17 18:30:45

Почему это происходит, кто-то подскажет мне причину этого явления? Надеюсь ответить

1 Ответ

0 голосов
/ 17 февраля 2020

Проблема здесь в том, что thread.Sleep () вызывается внутри критической секции. это заставляет поток записи удерживать блокировку в течение 3 секунд каждый раз и освобождает ее в течение очень небольшого промежутка времени, в течение которого поток записи повторно получает блокировку, поскольку, в данном случае, по-видимому, ReaderWriterLockSlim дает лучший приоритет авторам.

Я попытался вызвать Thread.Sleep () после снятия блокировки, и все работает как положено.

class LockProgram
{
    static ReaderWriterLockSlim rwLock = new ReaderWriterLockSlim();
    static void Main(string[] args)
    {
        for (int i = 0; i < 2; i++)
        {
            Task.Factory.StartNew(Read);
        }
        for (int i = 0; i < 1; i++)
        {
            Task.Factory.StartNew(Write);
        }
        Console.Read();
    }

    static void Read()
    {
        while (true)
        {
            rwLock.EnterReadLock(); ;                
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}  reading");
            rwLock.ExitReadLock();
            Thread.Sleep(100);
        }
    }
    static void Write()
    {
        while (true)
        {
            rwLock.EnterWriteLock();                
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} writing");
            rwLock.ExitWriteLock();
            Thread.Sleep(3000);
        }
    }
}

Стоит проверить. Net источник ссылки для ReaderWriterLockSlim и ReaderWriterLock

...