Хочу ли я когда-либо * не * использовать блокировку чтения / записи вместо ванильного мьютекса?

При синхронизации доступа к общему ресурсу, есть ли причина не использовать блокировку чтения / записи вместо ванильного мьютекса (которая по сути является просто блокировкой записи), кроме философской причины наличия у нее большего количества функций, чем мне может понадобиться?

Другими словами, если я просто по умолчанию использую блокировки чтения / записи в качестве предпочитаемой конструкции синхронизации, я стреляю в себя?

Мне кажется, что одно хорошее обоснование для того, чтобы всегда выбирать блокировку чтения / записи и, соответственно, использовать блокировку чтения и записи, заключается в том, что я могу реализовать некоторую синхронизацию, и мне больше никогда не придется думать об этом, получая при этом возможное преимущество от повышения производительности. масштабируемость в будущем, если однажды я уроню код в более конкурентную среду. Поэтому, если предположить, что он имеет потенциальную выгоду без каких-либо реальных затрат, имеет смысл использовать его постоянно. Имеет ли это смысл?

Это относится к системе, которая на самом деле не ограничена в ресурсах, это скорее вопрос производительности. Также я сформулировал этот вопрос в целом, но у меня есть Qt's QReadWriteLock а также QMutex (C++), особенно в виду, если это имеет значение.

2 ответа

Решение

На практике блокировка записи в паре блокировки чтения / записи обходится дороже, чем простой мьютекс. Блокировки чтения / записи всегда имеют некоторую стратегию координации, которая должна применяться при получении или снятии блокировки. В зависимости от конкретной реализации, эта стратегия может быть дешевой или дорогой, но она всегда существует.

В случае QReadWriteLockЕсть некоторая логика, которая отдает приоритет писателям. Хотя реализация такой логики может быть эффективной, и в очереди ожидания нет читателей, она никогда не бывает полностью бесплатной.

Я не знаком со всеми деталями QMutex а также QReadWriteLock реализация, но в документации сказано, что QMutex сильно оптимизирован для неконтролируемых случаев. QReadWriteLock не имеет такого замечания. Может быть, потому что они просто забыли сделать такую ​​заметку, но может быть потому, что ее поведение в таких условиях не так хорошо, как QMutex,

Я думаю, что в лучшем случае штраф за использование блокировки чтения / записи незначителен. Но в худшем случае, когда вы боретесь за каждую наносекунду, это может быть заметно.

Это действительно сводится к характеристике загруженности вашего замка. Случай, когда простой мьютекс будет работать значительно лучше, - это большая загруженность с предпочтением автора.

Это очень длинная и дискуссионная тема. Могу ли я порекомендовать чтение спинлоков, блокировок чтения и записи и блокировок чтения и записи, чтобы вы могли принять обоснованное решение?

Другие вопросы по тегам