C ++ вернуть обещание / будущее - PullRequest
2 голосов
/ 19 апреля 2020

Я пытаюсь превратить некоторый синхронный код (winsock2) в асинхронный код с обещаниями .

void sendRequest() {
    sendto(...);
    recvfrom(..., buffer);
    return buffer;
}

Я считаю, sendto & recvfrom - блокировка потока. Как бы я go о возврате Обещания / Будущего?

В Javascript Я бы go об этом:

function sendRequest() {
    return new Promise((res, rej) => {
        // get data
        res(myBuffer);
    });
}

Может и как это перевести на c ++?

1 Ответ

2 голосов
/ 19 апреля 2020
auto future = std::async(std::launch::async, sendRequest);

или

auto future = std::async(std::launch::async, []{ ... });

Будет то, что вы ищете.

Но лучше переключиться на асинхронные сокеты (с asio или любым другим). В библиотеках асинхронных сокетов, таких как asio, могут использоваться параметры c, определяемые платформой, чтобы избежать блокировки вызовов, поэтому вам не нужно выполнять операции в пуле потоков.

Если вы используете winsock и Нет планов перехода на другие платформы, вы также можете напрямую использовать windows асинхронные сокеты.

...