ReaderWriterLock
При разработке потокобезопастного кода (как например BufferPool), приходится часто задумываться о том что будет если несколько потоков сразу попробуют воспользоваться нашей функциональностью. Мы все грамотные люди, и знаем, что надо использовать объекты синхронизации. Какие? Гуру Сохацкий сразу скажет: критическая секция самый быстрый объект синхронизации, потому что,... а, неважно. И будет совершенно прав!
Но! Взглянув внимательно на код BufferPool, мы видим что большинство операций со списком буферов, который мы и защищаем, только читают его. И только метод Allocate, в случае если он не нашел подходящий буфер и решил создать новый - изменяет список буферов.
Это значит, что большинство пользователей нашего класса требуют блокировку только для чтения и абсолютно не мешают друг другу, и только очень редкие требуют блокировку для записи, которая мешает всем остальным. Какой выход? ReaderWriterLock.
После того, как Вы сходили по приведенной ссылке и прочитали что это и как оно работает, я не буду это объяснять, чтобы не повторяться...
Единственное, о чем хочу сказать - метод ReleaseReaderLock на самом деле отпускает не только блокировки читателя, но и блокировки писателя. Это действительно удобно и экономит несколько строчек кода.
Но! Взглянув внимательно на код BufferPool, мы видим что большинство операций со списком буферов, который мы и защищаем, только читают его. И только метод Allocate, в случае если он не нашел подходящий буфер и решил создать новый - изменяет список буферов.
Это значит, что большинство пользователей нашего класса требуют блокировку только для чтения и абсолютно не мешают друг другу, и только очень редкие требуют блокировку для записи, которая мешает всем остальным. Какой выход? ReaderWriterLock.
После того, как Вы сходили по приведенной ссылке и прочитали что это и как оно работает, я не буду это объяснять, чтобы не повторяться...
Единственное, о чем хочу сказать - метод ReleaseReaderLock на самом деле отпускает не только блокировки читателя, но и блокировки писателя. Это действительно удобно и экономит несколько строчек кода.
Коментарі