Рекурсивная и асинхронная лямбда с ++ - PullRequest
0 голосов
/ 05 апреля 2020

Среда:

  • C ++
  • Ubuntu x64
  • Асинхронный ввод-вывод

Фрагмент кода:

spThreadPool->WaitForIO(EPOLLIN, fd, 
                        [spThreadPool, this, pBuf, uiTotalBytes, completion](int fd){
                              int iBytes = read(fd, pBuf, uiTotalBytes)
                              uiTotalByes -= iBytes;
                              pBuf += iBytes;
                              if(0 == uiTotalByes)
                                    completion(SUCCESS)
                              else
                                    spThreadPool->WaitForIO(EPOLLIN, fd, std::this_lambda())
                  })

Поток действий:

  • spThreadPool выполняет асинхронное завершение ввода-вывода в произвольном потоке
  • При наличии дополнительных байтов (EPOLLIN) лямбда называется
  • Лямбда обратный вызов может вернуться с частичным чтением (то есть iBytes
  • Пока запрошенные байты не были полностью прочитаны, другое чтение req с той же лямбдой должно называться
  • ПРИМЕЧАНИЕ. : Поскольку это асинхронная c операция, контекст не сохраняется, а переменные стека очищаются

Постановка задачи

Есть ли способ ссылки на существующую лямбду функтор с новой операцией WaitForIO? например. используя воображаемый вызов std :: this_lambda ()?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...