Size: a a a

2021 July 02

AF

Aidar Fattakhov in C++ Together 2.0
Можно сказать что твой тредпул умеет только в копируемые лямбды но они никогда не копируются)
источник

AF

Aidar Fattakhov in C++ Together 2.0
А вместо юник поинтеров использовать auto_ptr из си++03
источник

RM

Roy Mustang in C++ Together 2.0
struct ITask {
   virtual void Execute() = 0;
   virtual void Result() = 0;
};

template <typename... Types>
struct Task : public ITask {
  void Execute() override {
     if(m_Job) { m_Job(m_UserData); }
  }

  void Result() overridde {
     if(m_Result) { m_Result(m_UserData); }
  }

  std::function<void (vec& data)> m_Job;
  std::function<void (vec& data)> m_Result;
  std::tuple<Types...> m_UserData;
};

1) Разраб вызывает
JobSystem.Execute([](std::tuple<....> userData) {
  // какая то логика, которая будет выполнена асинхронно
}, [](std::tuple<....> userData) {
  // какая то логика, которая будет выполнена в основном потоке
  // тут мы получаем уже обработанный userData (после асинхронки)
}, myData);

2) Внутри Job System метод Execute получает аргументы данных, создает Task объект и передает его воркерку на выполнение, тот вызывает ITask->Execute() и после выполнения он смотрит есть ли в ITask m_Result и если он есть, то этот Task перемещается в spsc очередь выполненных задач, если нету, то не перемещается, все, задача выполнена
3) Job System в методе Update вызывает .pop() в spsc очереди выполненных задач, достает от туда ITask и вызывает Result функцию (это в основном потоке)
4) Разработчику вызывается каллбэк куда передаются его данные с которыми были произведены асинхронные действия
источник

RM

Roy Mustang in C++ Together 2.0
Вопрос в том, как в Task передавать аргументы, что разработчик хочет передать чтоб выполнять логику в асинхронке
источник

RM

Roy Mustang in C++ Together 2.0
Я пока написал tuple, но я не уверен, хорошая ли это идея
источник

O

Ofee in C++ Together 2.0
ужас
источник

RM

Roy Mustang in C++ Together 2.0
Ну я же поэтому и прошу подсказать
источник

RM

Roy Mustang in C++ Together 2.0
Пока примерно так я себе это представляю
источник

RM

Roy Mustang in C++ Together 2.0
Кстати, почему ужас? Вроде логично
источник

RM

Roy Mustang in C++ Together 2.0
Единственное, неудобен тот факт, что надо две одинаковые лямбды передавать
источник

O

Ofee in C++ Together 2.0
Ко
источник

RM

Roy Mustang in C++ Together 2.0
но это только в том случае, если тебе нужно выполнить какую то логику в результате выполнения асинхронной операции
источник

O

Ofee in C++ Together 2.0
ру
источник

O

Ofee in C++ Together 2.0
ти
источник

O

Ofee in C++ Together 2.0
ны
источник

RM

Roy Mustang in C++ Together 2.0
Ты шо ебнулся
источник

RM

Roy Mustang in C++ Together 2.0
Какие корутины, речь про нормальную асинхронность
источник

O

Ofee in C++ Together 2.0
Потому что сразу повеяло каким-то гибридом C++03 и C++11
источник

O

Ofee in C++ Together 2.0
Корутины и созданы для реализации нормальной асинхронности
источник

RM

Roy Mustang in C++ Together 2.0
Корутины вызываются в основном потоке
источник