Повтор вызова функции с возвращаемым значением c++

Всем привет! У меня есть функции (возможно она принимает параметры) она возвращает значение:

string task()
{
 // work here
 return something;
}

Есть ли какой то простой способ сделать так, чтобы эта функция вызывалась бесконечное количество раз, с интервалом в 1 секунду (или любым другим chrono интервалом)

Я попробовал сделать это с помощью thread, но треды не возвращают значение. Возможно, можно как то сделать это с помощью async и futures

С теми значениями, которые возвращает функция, я бы хотел работать в главном треде.

UPD добавил псевдокод

string task() {
    // do repeatly work
    return something;
}

int main() {
    int num = 0;
    int interval = 100;
    bool _execute = true;

    std::future<string> result;

    // repeatly work with task
    // ?????

    // I need data from task function in main thread
    std::cout << result.get() << std::endl;

    return 0;
}

Результаты того, что будет выдавать функция я планирую складывать в ограниченную по размеру(чтобы старые возвращаемые значения функции удалялись) очередь std::deque

UPD:

Еще один псевдокод, здесь с помощью треда можно итерационно вызывать функцию void (обратите внимание, что мне нужно не void а string)

#include <iostream>
#include <functional>
#include <thread>
#include <future>

#include <cpr/cpr.h>


void start(int interval, std::function<void()> func)
{
    bool _execute = true;
    std::thread([=]() {
        while (_execute) {
            func();
            std::this_thread::sleep_for(std::chrono::seconds(interval));
        }
    }).join();
}

void task()
{
    // some work
}


int main() 
{
    // all data
    std::vector<std::string> data;

    // pointer to function
    std::function<void()> pToFunc = std::bind(task);
    start(1, pToFunc);

    return 0;
}

Ответы (1 шт):

Автор решения: Harry

с вектором и тредом особенно интересно как это выглядит

Да все просто... Примерно так - мьютекс и вектор, для простоты сделал глобальными

mutex useVector;
vector<string> strs;

Функция, которая строку делает и в вектор запихивает (через мьютекс!)

void doit()
{
    // Make String
    useVector.lock();
    strs.push_back("Hello");
    useVector.unlock();
}

Функция, которая отдельным потоком каждую секунду вызывает указанную (именно через sleep_until, чтоб погрешности времени не накапливать)

void DoIt()
{
    auto timer{chrono::steady_clock::now()};
    for(;;)
    {
        timer += 1000ms;
        this_thread::sleep_until(timer);

        // Если вызов быстрый - можно просто выполнять его здесь,
        // без отдельного потока. Словом, выбирайте - 
        thread(doit).detach();
        // или
        doit();
    }
}

Ну, и убедиться, что это работает - опять же через мьютекс вывожу в цикле размер вектора:

int main(int argc, char * argv[])
{
    thread(DoIt).detach();
    for(;;)
    {
        this_thread::sleep_for(500ms);
        useVector.lock();
        cout << strs.size() << endl;
        useVector.unlock();
    }
}

Это - всего лишь как один из вариантов...

→ Ссылка