// 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 раз, и только после того, как этот поток записи начнет выполнять свою работу?
Я полагаю, что в этой ситуации, если потоки чтения и записи разделяют одну и ту же блокировку, у автора все равно будет возможность что-то написать. Думайте об этом как это под капотом:
Допустим, в данный момент reader1 заблокирован. Reader2, reader3 и reader4 находятся в очереди в ожидании блокировки. В этот момент писатель также ставит себя в очередь, чтобы дождаться блокировки. Как только reader1 завершает работу, он снимает блокировку и затем снова помещает себя в очередь. Тем не менее, обратите внимание, что на данный момент он находится в очереди после писатель.
Как только считыватель2, считыватель3 и считыватель4 вытолкнут из очереди и выполнят свою работу, у писателя будет возможность получить блокировку.
Хотя этот код не очень эффективен (в основном он запускается последовательно), он будет работать. Кроме того, поскольку вы находитесь в этой теме, вам следует изучить различные реализации программы чтения / записи, используя несколько блокировок, счетчиков и т. Д. 🙂
Других решений пока нет …