Минимизируйте явное совместное использование изменяемых данных
Причина
Если вы не делитесь изменяемыми данными, вы не можете иметь гонку данных. Чем меньше вы делитесь, тем меньше шанс, что вы забудете синхронизировать доступ (и получите гонки данных). Чем меньше вы делитесь, тем меньше шанс, что вам придётся ждать блокировки (так что производительность может улучшиться).
Пример
bool validate(const vector<Reading>&);
Graph<Temp_node> temperature_gradients(const vector<Reading>&);
Image altitude_map(const vector<Reading>&);
// ...
void process_readings(const vector<Reading>& surface_readings)
{
auto h1 = async([&] { if (!validate(surface_readings)) throw Invalid_data{}; });
auto h2 = async([&] { return temperature_gradients(surface_readings); });
auto h3 = async([&] { return altitude_map(surface_readings); });
// ...
h1.get();
auto v2 = h2.get();
auto v3 = h3.get();
// ...
}
Без этих constов мы должны были бы проверить каждую асинхронно вызванную функцию для потенциальных гонок данных на surface_readings. Создание surface_readings const (в отношении этой функции) позволяет рассуждать, используя только тело функции.
Примечание
Неизменяемые данные могут быть безопасно и эффективно общими. Блокировка не требуется: Вы не можете иметь гонку данных на постоянной. См. также CP.mess: Передача сообщений и CP.31: предпочитайте передачу по значению.
Применение
???