• Линеаризуем асинхронный код с помощью корутин

      image

      Помимо использования корутин для создания генераторов, их можно попробовать использовать для линеаризации уже существующего асинхронного кода. Давайте попробуем это сделать на небольшом примере. Возьмем код, написанный на акторном фреймворке и перепишем одну функцию этого кода на корутины. Для сборки проекта будем использовать gcc из ветки coroutines.

      Наша цель — получить из лапши коллбэков:

          abActor.getA(ABActor::GetACallback([this](int a) {
              abActor.getB(ABActor::GetBCallback([a, this](int b) {
                  abActor.saveAB(a - b, a + b, ABActor::SaveABCallback([this](){
                      abActor.getA(ABActor::GetACallback([this](int a) {
                          abActor.getB(ABActor::GetBCallback([a, this](int b) {
                              std::cout << "Result " << a << " " << b << std::endl;
                          }));
                      }));
                  }));
              }));
          }));
      

      Что-то вроде:

      const int a = co_await actor.abActor.getAAsync();
      const int b = co_await actor.abActor.getBAsync();
      co_await actor.abActor.saveABAsync(a - b, a + b);
      const int newA = co_await actor.abActor.getAAsync();
      const int newB = co_await actor.abActor.getBAsync();
      std::cout << "Result " << newA << " " << newB << std::endl;
      

      Итак, приступим.
      Читать дальше →
    • Как же, черт возьми, отсортировать этот список?

        Пусть у нас есть список — содержимое каталога, в котором элементами являются экземпляры классов File и Folder. Задача — отсортировать этот список. Есть два широко известных варианта сортировки структуры каталога — когда сначала идут каталоги, а потом файлы, и когда файлы и каталоги сортируются вперемешку. Нам нужно дать пользователю возможность выбирать любой из этих вариантов.

        Впервые на похожую задачу я наткнулся на прошлой работе. К слову, решена эта задача была методом 3 из данной статьи. «Как неэстетично», — подумал я. — «Дали бы мне эту задачу, я бы точно решил ее в 128 раз лучше. Но… как?»

        С той поры минуло уже 5 лет, а я, время от времени мысленно возвращаясь к данной задаче, так и не придумал к ней идеального решения. Тем не менее, за это время у меня успело накопиться несколько идей, которыми я хочу с вами поделиться.
        Читать дальше →
      • Особенности профилирования программ на C++


          Временами бывает нужно отпрофилировать производительность программы или потребление памяти в программе на C++. К сожалению, зачастую это сделать не так просто как может показаться.

          Здесь будут рассмотрены особенности профилирования программ с использованием инструментов valgrind и google perftools. Материал получился не очень структурированным, это скорее попытка собрать базу знаний «для личных целей», чтобы в будущем не приходилось судорожно вспоминать, «а почему не работает то» или «а как сделать это». Скорее всего, здесь будут затронуты далеко не все неочевидные случаи, если вам есть что добавить, пишите пожалуйста в комментарии.

          Все примеры будут запускаться в системе linux.
          Читать дальше →