Передавайте небольшое количество данных между потоками по значению, а не по ссылке или указателю
Причина
Небольшой объем данных дешевле копировать и получать доступ, чем обмениваться им с использованием некоторого механизма блокировки. Копирование естественно дает уникальное владение (упрощает код) и исключает возможность гонки данных.
Примечание
Точное определение "небольшого количества" невозможно.
Пример
string modify1(string);
void modify2(string&);
void fct(string& s)
{
auto res = async(modify1, s);
async(modify2, s);
}
Вызов modify1 включает копирование двух значений string; вызов modify2 нет. С другой стороны, реализация modify1 точно такая, как мы написали бы для однопоточного кода, тогда как реализация modify2 потребует некоторой формы блокировки для избежания гонок данных. Если строка короткая (скажем, 10 символов), вызов modify1 может быть удивительно быстрым; по сути, все затраты на переключение thread. Если строка длинная (скажем, 1 000 000 символов), копирование ее дважды наверное не хорошая идея.
Отметьте, что этот аргумент не имеет никакого отношения к async как таковому. Это в равной степени применяется к рассмотрениям о том, использовать ли передачу сообщений или общую память.
Применение
???