Хочу ли я когда-либо * не * использовать блокировку чтения / записи вместо ванильного мьютекса?
При синхронизации доступа к общему ресурсу, есть ли причина не использовать блокировку чтения / записи вместо ванильного мьютекса (которая по сути является просто блокировкой записи), кроме философской причины наличия у нее большего количества функций, чем мне может понадобиться?
Другими словами, если я просто по умолчанию использую блокировки чтения / записи в качестве предпочитаемой конструкции синхронизации, я стреляю в себя?
Мне кажется, что одно хорошее обоснование для того, чтобы всегда выбирать блокировку чтения / записи и, соответственно, использовать блокировку чтения и записи, заключается в том, что я могу реализовать некоторую синхронизацию, и мне больше никогда не придется думать об этом, получая при этом возможное преимущество от повышения производительности. масштабируемость в будущем, если однажды я уроню код в более конкурентную среду. Поэтому, если предположить, что он имеет потенциальную выгоду без каких-либо реальных затрат, имеет смысл использовать его постоянно. Имеет ли это смысл?
Это относится к системе, которая на самом деле не ограничена в ресурсах, это скорее вопрос производительности. Также я сформулировал этот вопрос в целом, но у меня есть Qt's QReadWriteLock
а также QMutex
(C++), особенно в виду, если это имеет значение.
2 ответа
На практике блокировка записи в паре блокировки чтения / записи обходится дороже, чем простой мьютекс. Блокировки чтения / записи всегда имеют некоторую стратегию координации, которая должна применяться при получении или снятии блокировки. В зависимости от конкретной реализации, эта стратегия может быть дешевой или дорогой, но она всегда существует.
В случае QReadWriteLock
Есть некоторая логика, которая отдает приоритет писателям. Хотя реализация такой логики может быть эффективной, и в очереди ожидания нет читателей, она никогда не бывает полностью бесплатной.
Я не знаком со всеми деталями QMutex
а также QReadWriteLock
реализация, но в документации сказано, что QMutex
сильно оптимизирован для неконтролируемых случаев. QReadWriteLock
не имеет такого замечания. Может быть, потому что они просто забыли сделать такую заметку, но может быть потому, что ее поведение в таких условиях не так хорошо, как QMutex
,
Я думаю, что в лучшем случае штраф за использование блокировки чтения / записи незначителен. Но в худшем случае, когда вы боретесь за каждую наносекунду, это может быть заметно.
Это действительно сводится к характеристике загруженности вашего замка. Случай, когда простой мьютекс будет работать значительно лучше, - это большая загруженность с предпочтением автора.
Это очень длинная и дискуссионная тема. Могу ли я порекомендовать чтение спинлоков, блокировок чтения и записи и блокировок чтения и записи, чтобы вы могли принять обоснованное решение?