Concurrency and parallelism
CP.4
Думайте в терминах задач, а не потоков
Причина
thread — это концепция реализации, способ размышления о машине. Задача — это концепция приложения, что-то, что вы хотите сделать, предпочтительно одновременно с другими задачами. Концепции приложения легче анализировать.
Пример
void some_fun(const std::string& msg)
{
std::thread publisher([=] { std::cout << msg; }); // плохо: менее выразительно
// и более подвержено ошибкам
auto pubtask = std::async([=] { std::cout << msg; }); // ОК
// ...
publisher.join();
}
Примечание
Исключая async(), стандартные библиотечные функции имеют низкий уровень, ориентированы на машину, на уровне потоков и блокировок. Это необходимая основа, но мы должны попытаться повысить уровень абстракции: для производительности, надежности и производительности. Это веский аргумент в пользу использования библиотек более высокого уровня, более ориентированных на приложения (если возможно, построенных на основе стандартных библиотечных функций).
Применение
???