Могут ли периодические блокировки чтения в нескольких потоках надолго затормозить поток записи?

// thread function for readers
void func_readers()
{
    for (int i = 0; i < 1000000; ++i)
    {
        read_lock();
        //do some work;
    }
}

// thread function for writers
void func_writers()
{
    write_lock();
    // do some work;
}

Допустим, есть 4 потока чтения, и начинает работать поток записи. Он останавливается, так как имеется 4 потока чтения. Когда первый поток чтения завершает итерацию, он запускает другую и вызывает read_lock(). поток записи все еще ждет, так как есть 3 потока чтения. Поскольку записывающего потока нет, первый читающий поток начинает другую итерацию и так далее... Значит ли это, что все 4 потока будут выполнять свою работу 1000000 раз, и только после этого начнет выполнять свою работу записывающий поток?


person user1289    schedule 07.12.2017    source источник


Ответы (1)


Я считаю, что в этой ситуации, если потоки чтения и записи используют одну и ту же блокировку, у писателя все еще будет шанс что-то написать. Думайте об этом как об этом под капотом:

Допустим, у читателя 1 в настоящее время есть блокировка. Reader2, reader3 и reader4 находятся в очереди в ожидании блокировки. Именно в этот момент модуль записи также ставит себя в очередь на ожидание блокировки. Как только reader1 завершает работу, он снимает блокировку и снова ставит себя в очередь. Однако обратите внимание, что на данный момент он стоит в очереди после модуля записи.

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

Хотя этот код не очень эффективен (в основном он будет работать последовательно), он будет работать. Кроме того, поскольку вы находитесь в этой теме, вам следует изучить различные реализации чтения/записи с использованием нескольких блокировок, счетчиков и т. д. :)

person Phil    schedule 07.12.2017
comment
Это не случайно, автор ветки обязательно его получит. Это ответ на вопрос: вызывающий поток получает блокировку чтения, если модуль записи не удерживает блокировку и нет заблокированных модулей записи. Это не мой код, я придумал его, чтобы задать этот вопрос. - person user1289; 07.12.2017