Существует asyn c methodB, который я не могу напрямую заблокировать с помощью get (), поскольку это однопоточное приложение, которое может вызвать взаимоблокировку. (Некоторые детали опущены, чтобы сосредоточиться на реальной проблеме)
Я получаю ошибку компиляции, например: шаблон кандидата проигнорирован: ошибка замены [с F = bool]: нет типа с именем 'type' в 'std :: invoke_result'
У меня 3 проблемы с кодом, перечисленные с комментариями. Любая помощь приветствуется.
#include <utility>
#include <iostream>
#include <folly/Format.h>
#include <folly/futures/Future.h>
#include <folly/executors/ThreadedExecutor.h>
#include <folly/Uri.h>
#include <folly/FBString.h>
using namespace std;
bool methodA() {
auto promise = std::make_shared<folly::Promise<bool>>();
addSessionConnectedCallback([=]() {
promise->setWith(executeActionInThreadPool([=]() { // 1 COMPILATION ERROR
methodB();
}));
});
blockUntilMatch<bool>(true, [&promise]() { return promise.hasValue(); });
return true; // 2 Want to return the value from methodB
}
folly::Future<bool> methodB(); // It could return true/false or exception
template <typename Value>
bool blockUntilMatch(
const Value& expected,
std::function<Value(void)> fn) {
auto match = false;
auto start = std::chrono::system_clock::now();
while (!match) {
auto newValue = fn();
match = newValue == expected;
std::this_thread::sleep_for(std::chrono::milliseconds(1));
if (std::chrono::system_clock::now() > start + std::chrono::seconds(10)) {
return false;
}
}
return true;
}
bool executeActionInThreadPool( // has to be sync
std::function<bool()> action) {
folly::CPUThreadPoolExecutor executor{1};
folly::makeFuture()
.via(executor.weakRef())
.thenValue([action](auto&&) { action(); }).get();
return true; // 3 Should be the return value of action()
}
int main()
{
cout<< methodA();
return 0;
}